【问题标题】:Better way to get a frequency table for continuous data (R)?获得连续数据 (R) 频率表的更好方法?
【发布时间】:2011-12-20 11:53:12
【问题描述】:

用 df:

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

但是是否有一种一次性的方式来返回上述矩阵?谢谢!

【问题讨论】:

    标签: r dataframe frequency


    【解决方案1】:
    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%)
    

    【讨论】:

    • 而且,如果不想指定左右截断点,设置breaks=c(-Inf, 25, Inf)
    • 不错的提示。我自己总是忘记这一点。
    • 谢谢!应该更好地了解 table()。 :)
    【解决方案2】:

    使用reshape2 的另一种解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多