2011-11-02 23 views
7

Con df:¿Mejor forma de obtener una tabla de frecuencia para datos continuos (R)?

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

que necesito para obtener una tabla de frecuencia (porcentaje) (mejor devolver una matriz) como el siguiente:

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

que pueda hacer esto usando:

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

¿Pero habría una forma única de devolver una matriz como la anterior? ¡Gracias!

Respuesta

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 

(Por supuesto, esto se puede combinar en 1 línea si lo desea, pero dejó como 2 aquí para una mejor legibilidad.)

EDIT: Y si quieres una mesa de proporciones , con formato de frecuencias, que puede hacer:

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

Y, si no desea especificar los puntos de truncamiento izquierdo y derecho, establezca 'breaks = c (-Inf, 25, Inf)'. –

+0

Buen consejo. Siempre me olvido de eso, yo mismo. –

+0

¡Gracias! Debería haber sabido mesa() mejor. :) – Rock

2

Otra solución usando reshape2.

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

gracias! aprendiendo nuevo todos los días :) – Rock

Cuestiones relacionadas