获得连续数据(R)频率表的更好方法是什么?

Roc*_*ock 7 r frequency dataframe

随着df:

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

我需要得到一个频率(百分比)表(更好地返回一个矩阵),如下所示:

value | status(0)  status(1)
----------------------------
 <=25 |  23 (23%)   20 (20%)
  >25 |  27 (27%)   25 (25%)
   NA |   3  (3%)    2  (2%)
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

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)))
Run Code Online (Sandbox Code Playgroud)

但是会有一次性的方式返回上面的矩阵吗?谢谢!

Joh*_*lby 11

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

(当然,如果你愿意,可以将它组合成一行,但为了更好的可读性,我把它留在了2行.)

编辑:如果你想要一个比例表,格式化为频率,你可以这样做:

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

  • 并且,如果您不想指定左右截断点,请设置`breaks = c(-Inf,25,Inf)`. (3认同)