获取连续数据(R)频率表的更好方法?

发布于 2024-12-13 17:07:14 字数 685 浏览 0 评论 0原文

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

但是是否有一种一次性方法可以返回上述矩阵?谢谢!

With df:

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

I need to get a frequency (percentage) table (better return a matrix) like the following:

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

I can do this using:

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

But would there be a one-time way to return a matrix as above? Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青瓷清茶倾城歌 2024-12-20 17:07:14
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%)
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

(Of course this can be combined into 1 line if you want, but I left it as 2 here for better readability.)

EDIT: And if you want a table of proportions, formatted as frequencies, you can do:

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%)
孤独岁月 2024-12-20 17:07:14

另一种解决方案使用reshape2

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

Another solution using reshape2.

library(reshape2)
dcast(df, cut(value, breaks = c(0, 25, 100)) ~ status)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文