2014-12-28 2 views
2

그룹으로 나누어 진 범주 형 변수의 data.frame이 있으며 각 그룹에 대한 개수가 있습니다.특정 그룹에 대한 상대 빈도 계산

My original data nyD looks like: 

Source: local data frame [7 x 3] 
Groups: v1, v2, v3 

    v1 v2 v3 
1 a plus yes 
2 a plus yes 
3 a minus no 
4 b minus yes 
5 b  x yes 
6 c  x notk 
7 c  x notk 

I performed the following operations using dplyr: 

ny1 <- nyD %>% group_by(v1,v2,v3)%>% 
      summarise(count=n()) %>% 
      mutate(prop = count/sum(count)) 


My data "ny1" looks like: 

Source: local data frame [5 x 5] 
Groups: v1, v2 

    v1 v2 v3 count prop 
1 a minus no  1 1 
2 a plus yes  2 1 
3 b minus yes  1 1 
4 b  x yes  1 1 
5 c  x notk  2 1 

나는 prop 변수의 V1 그룹과 관련하여 상대 빈도를 계산하려고합니다. prop 변수는 해당 계수를 "V1 그룹의 계수의 합"으로 나눈 값이어야합니다. V1 그룹에는 총 3 개의 "a", 2 개의 "b"및 1 개의 "c"가 있습니다. 즉, ny1 $ prop [1] < - 1/3, ny1 $ prop [2] <-2/3 .... count/sum (count)을 사용하는 mutate 연산이 올바르지 않습니다. 합계를 V1 그룹에만 실현하도록 지정해야합니다. 이것을 달성하기 위해 dplyr을 사용할 방법이 있습니까?

답변

5

원본 데이터 nyD에서이 모든 작업을 한 번에 수행 할 수 있으며 ny1을 만들지 않아도됩니다. 당신이 summarisemutate를 실행하겠습니다 때, dplyr 기본적으로 (dplyr에서 확실히 내가 가장 좋아하는 기능)을 하나 개의 통합 레벨 (v2)을 삭제하고 v1

nyD %>% 
    group_by(v1, v2) %>% 
    summarise(count = n()) %>% 
    mutate(prop = count/sum(count)) 

# Source: local data frame [5 x 4] 
# Groups: v1 
# 
# v1 v2 count  prop 
# 1 a minus  1 0.3333333 
# 2 a plus  2 0.6666667 
# 3 b minus  1 0.5000000 
# 4 b  x  1 0.5000000 
# 5 c  x  2 1.0000000 

만 집계됩니다 또는 짧은 버전 count을 사용하기 때문이다 (@beginneR 덕분)

df %>% 
    count(v1, v2) %>% 
    mutate(prop = n/sum(n)) 
+2

또는 짧은 비트 : '카운트 (DF, V1, V2) %> % 돌연변이 ((= N/합 소품 N))' –

+0

감사 '내부 df'와 퍼팅 비록 'count'는 약간 부정 행위입니다 :)'summary '내에'df'를 넣을 수도 있습니다. 더 나은 해결책 더 나은 해결책 –

+0

'group()'표현식의 변수 순서 또한 중요하며 상대 비율 계산 방법을 결정할 것임을 명심하십시오. –