2011-11-02 7 views
7

:연속 데이터 (R)에 대한 주파수 테이블을 얻는 더 나은 방법은 무엇입니까? DF와

내가 좋아하는 (더 나은 행렬을 반환) 주파수 (백분율) 표를 얻을 필요가
df <- data.frame(value=abs(rnorm(100, 25, 5)), status=sample(0:1,100,replace=T)) 
df$value[sample(1:100,5)] <- NA 

다음

br <- seq(0, 50, 25) 
with(df, summary(cut(value[status==0], br, labels=br[-1], 
    include.lowest=T, ordered_result=T))) 
with(df, summary(cut(value[status==1], br, labels=br[-1], 
    include.lowest=T, ordered_result=T))) 
:

value | status(0) status(1) 
---------------------------- 
<=25 | 23 (23%) 20 (20%) 
    >25 | 27 (27%) 25 (25%) 
    NA | 3 (3%) 2 (2%) 

내가 사용하여이 작업을 수행 할 수 있습니다

하지만 위와 같이 행렬을 반환하는 일회성 방법이 있습니까? 감사!

답변

11
df$value.cut = cut(df$value, breaks=c(0, 25, 100)) 
> with(df, table(value.cut, status, useNA='ifany')) 
      status 
value.cut 0 1 
    (0,25] 26 19 
    (25,100] 26 24 
    <NA>  3 2 

(당신이 원한다면 물론이 한 라인으로 결합 할 수 있습니다,하지만 난 더 나은 가독성을 위해 여기 2로 떠났다.)

편집 : 그리고 당신은 비율의 테이블을 원하는 경우 , 주파수로 포맷을 수행 할 수 있습니다 : 또 다른 해결책은 reshape2를 사용

df.tab = with(df, table(value.cut, status, useNA='ifany')) 
df.tab[,] = paste(df.tab, ' (', 100*prop.table(df.tab), '%)', sep='') 
> df.tab 
      status 
value.cut 0  1  
    (0,25] 26 (26%) 19 (19%) 
    (25,100] 26 (26%) 24 (24%) 
    <NA>  3 (3%) 2 (2%) 
+3

왼쪽 및 오른쪽 잘림 점을 지정하지 않으려면'breaks = c (-Inf, 25, Inf)'를 설정하십시오. –

+0

멋진 팁. 나는 항상 그것을 잊어 버린다. –

+0

감사! Table()을 잘 알아야합니다. :) – Rock

2

.

library(reshape2) 
dcast(df, cut(value, breaks = c(0, 25, 100)) ~ status) 
+0

감사합니다! 매일 새로운 학습 :) – Rock