2017-01-06 3 views
0

저는 직업과 해의 백분율로 값을 계산하려고합니다.한 열의 다른 행에서 백분율을 계산하는 방법은 무엇입니까?

665/(665 + 709) =

내가 평균을 계산하는 골재를 사용 할 수있었습니다 48.4을하지만, 계산하는 방법에 붙어 오전 : df 아래 사용 예로서, 첫 번째 행의 비율이 될 것이다 비율 : aggregate(x=df$value, by=list(df$occupation, df$year),FUN = mean) 당신이 찾고있는 대답은

df <- data.frame(
    year = c(rep(2003, 8), rep(2005, 8)), 
    sex = c(rep(0, 4), rep(1, 4)), 
    occupation = rep(c(1:4), 4), 
    value = c(665, 661, 695, 450, 709, 460, 1033, 346, 808, 959, 651, 468, 756, 832, 1140, 431) 
) 
+2

[최소, 완전하고 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 만드는 방법에 대한이 팁과 [ R] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). 아마도 [좋은 질문을 묻는] (http://stackoverflow.com/help/how-to-ask)에 대한 다음 팁도 읽을만한 가치가있을 것입니다. – lmo

답변

2

내가 생각 : 기본적으로

aggregate(
    x = df$value, 
    by = list(df$occupation, df$year), 
    FUN = function(x) { 
    round(x/sum(x) * 100, 1) 
    } 
) 

, 응답 거짓말의 핵심 FUN 인수에; 백분율을 계산하려면 R에 집계 할 때 수행 할 작업을 알리는 함수가 필요합니다. R에는 평균 함수가 내장되어 있으므로 평균을 계산할 때 meanFUN에 제공 할 수있었습니다. Hadley Wickham의 Advanced R의 functional programming chapter에는 이름이 지정된 함수와 익명의 함수를 만드는 데 대한 자세한 내용이 있습니다.

즉, 이와 같은 데이터 조작 작업의 경우 dplyr과 같은 패키지는 작업을 덜 복잡하고 읽기 쉽도록 만드는 데 탁월합니다. 위의 집계 답변을 사용할 수는 있지만 (예 : 패키지를 만들고 종속성을 피하기 위해) 이유가없는 경우 추가 패키지를 사용하면 코드를 더 읽기 쉽고 유지 관리하기가 쉽습니다.

library(dplyr) 
output <- 
    df %>% 
    group_by(year, occupation) %>% 
    mutate(percent = round(value/sum(value) * 100, 1)) 

이 방법의 다른 장점은 기본적으로 사용할 수 있지만 꽤 결과를 집계,보다 청소기 방법으로 원래의 데이터 구조에 추가하는 것입니다.

vignette에는 이러한 유형의 데이터 조작 작업에 대한 훌륭한 예제가 있습니다. dplyr/tidyr cheatsheet도 이러한 종류의 작업에 유용합니다.

내 대답은 도구를 사용하기 때문에 dplyr에 의존합니다. 확실히 주어진 작업에 더 적합한 다른 것들 (plyr, data.table)이 있습니다. 이 문제에 대해서는 여전히 dplyr을 좋아하지만, 다른 옵션에 대해서는 언급 할 것입니다. 왜냐하면 항상 the best tool for the job에 대해 생각할 가치가 있기 때문입니다.

+0

대단히 감사합니다! 너 너무 근사해! 저는 R의 새로운 학습자입니다. 당신의 대답은 저에게 매우 유익합니다! –