2011-11-02 33 views
7

Với df:Cách nào tốt hơn để có bảng tần số cho dữ liệu liên tục (R)?

df <- data.frame(value=abs(rnorm(100, 25, 5)), status=sample(0:1,100,replace=T)) 
df$value[sample(1:100,5)] <- NA 

tôi cần để có được một (tỷ lệ phần trăm) Bảng tần số (trở lại tốt hơn một ma trận) như sau:

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

tôi có thể làm điều này bằng:

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

Nhưng có cách nào để trả lại ma trận như trên không? Cảm ơn!

Trả lời

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 

(Tất nhiên điều này có thể được kết hợp thành 1 dòng nếu bạn muốn, nhưng tôi rời nó như 2 vào đây để đọc rõ hơn.)

EDIT: Và nếu bạn muốn có một bảng tỷ lệ có định dạng là tần số, bạn có thể làm:

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

Và nếu bạn không muốn chỉ định các điểm cắt trái và phải, hãy đặt 'breaks = c (-Inf, 25, Inf)'. –

+0

Mẹo hay. Tôi luôn quên điều đó. –

+0

Cảm ơn! Nên biết bảng() tốt hơn. :) – Rock

2

Một giải pháp khác sử dụng reshape2.

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

cảm ơn! học mới mỗi ngày :) – Rock

Các vấn đề liên quan