2011-11-02 18 views
7

:Sürekli veriler için bir frekans tablosu almanın daha iyi yolu (R)? df ile

ben gibi (daha iyi bir matris dönüş) bir frekans (yüzde) tablo almak gerekir
df <- data.frame(value=abs(rnorm(100, 25, 5)), status=sample(0:1,100,replace=T)) 
df$value[sample(1:100,5)] <- NA 

aşağıdadır:

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%) 

ben kullanarak yapabilirsiniz

Ancak bir matrisi yukarıdaki gibi döndürmek için tek seferlik bir yol var mı? Teşekkürler!

cevap

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 

(isterseniz Tabii bu 1 hattına kombine edilebilir, ama daha iyi okunabilmesi için buraya 2 olarak bıraktı.)

EDIT: Ve oranlarda tablosu istiyorsanız , frekanslar olarak biçimlendirilmiş, yapabileceğiniz: Başka bir çözüm reshape2 kullanılarak

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

Ayrıca, sol ve sağ kesme noktalarını belirtmek istemiyorsanız, 'breakks = c (-Inf, 25, Inf)' seçeneklerini ayarlayın. –

+0

Güzel bahşiş. Bunu hep unutuyorum, kendim. –

+0

Teşekkürler! Tablo() daha iyi bilmeliydi. :) – Rock

2

.

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

teşekkürler! her gün yeni öğrenme :) – Rock

İlgili konular