Лучший способ получить таблицу частот для непрерывных данных (R)?

С ДФ:

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

Мне нужно получить таблицу частот (процентов) (лучше вернуть матрицу), например:

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

Я могу сделать это, используя:

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

Но будет ли одноразовый способ вернуть матрицу, как указано выше? Спасибо!


person Rock    schedule 02.11.2011    source источник


Ответы (2)


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

(Конечно, если хотите, это можно объединить в 1 строку, но я оставил здесь 2 для лучшей читабельности.)

РЕДАКТИРОВАТЬ: И если вам нужна таблица пропорций, отформатированная как частоты, вы можете сделать:

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%)
person John Colby    schedule 02.11.2011
comment
И, если вы не хотите указывать левую и правую точки усечения, установите breaks=c(-Inf, 25, Inf). - person Josh O'Brien; 02.11.2011
comment
Хороший совет. Я сам всегда об этом забываю. - person John Colby; 02.11.2011
comment
Спасибо! Должен был знать table() лучше. :) - person Rock; 02.11.2011

Другое решение с использованием reshape2.

library(reshape2)
dcast(df, cut(value, breaks = c(0, 25, 100)) ~ status)
person Ramnath    schedule 02.11.2011