【问题标题】:frequency table and group by multiple variables in r频率表和按 r 中的多个变量分组
【发布时间】:2017-06-16 09:56:46
【问题描述】:

伙计们,我需要一种优雅的方式来创建频率计数并按多个变量分组。输出应该是一个数据框。我知道答案在于使用我仍在学习的 dplyr 和 data.table 。 我试过这个link,但我想使用 dplyr 和 data.table 来做到这一点。

这是来自同一链接的示例数据 -

ID <- seq(1:177)
Age <- sample(c("0-15", "16-29", "30-44", "45-64", "65+"), 177, replace = TRUE)
Sex <- sample(c("Male", "Female"), 177, replace = TRUE)
Country <- sample(c("England", "Wales", "Scotland", "N. Ireland"), 177, replace = TRUE)
Health <- sample(c("Poor", "Average", "Good"), 177, replace = TRUE)
Survey <- data.frame(Age, Sex, Country, Health)

这是我正在寻找的输出。感谢并感谢您的帮助!

【问题讨论】:

  • 我也可以在数据框中没有总计,但我不想输入实际因子水平作为 akrun 建议的代码的一部分 - “[, Total := Average + 好 + 差][]"
  • library(tidyverse); Survey %&gt;% count(Age, Sex, Health) %&gt;% spread(Health, n, fill = 0)
  • 感谢 alistaire...tidyverse 看起来不错!....它是否还允许像您在“spread(Health,....)”中所做的那样通过指定来计算不同的、平均的和求和的功能n?
  • 当然。 count 确实是group_by(...) %&gt;% summarise(n = n()) 的快捷方式,但你可以指定任何你喜欢的东西。 Hadley 的R for Data Science 是一个很好的起点。
  • 我挑战关闭。这要求对三向表进行“平面”表示,这种东西由处理多向列联表的基本 ftable 函数提供。

标签: r count data.table dplyr frequency


【解决方案1】:

这是一种使用data.tabletidyr 但不使用dcast 的方法。首先,您通过感兴趣的变量计算j.N 的观察结果

Survey[, .N, by=.(Age, Sex, Health)]

返回:

 Age   Sex     Health   N
 30-44 Female  Average  10
 65+   Female  Poor     9
 0-15  Male    Average  3
 16-29 Male    Average  6
 30-44 Male    Good     6
 45-64 Female  Average  8

然后,使用tidyr 中的spread 将您选择的列转换为一组由N 填充的新列(每个唯一值一个)

spread(Survey[, .N, by=.(Age, Sex, Health)], Health, N)

【讨论】:

  • 感谢 moman82...从你们所有人那里学到了一些新东西。
【解决方案2】:

我们可以从data.table使用dcast

library(data.table)
dcast(setDT(Survey), Age + Sex ~Health, value.var = "Country",
                   length)[, Total := Average + Good + Poor][]

如果我们不想输入列名,请使用 Reduce+

dcast(setDT(Survey), Age + Sex ~Health, value.var = "Country",
                length)[, Total := Reduce(`+`, .SD), .SDcols = Average:Poor][]

【讨论】:

  • 谢谢 akrun...有没有办法不在代码中输入因子水平?我很好,数据帧输出中没有总计。很抱歉给您带来麻烦,感谢您的快速响应!
  • @Jennifer 更新了帖子
  • 投了两个答案 akrun :)...它没有显示,所以我似乎没有足够的声誉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-11-18
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多