【问题标题】:Using dplyr to summarize by multiple groups使用 dplyr 进行多组汇总
【发布时间】:2016-04-27 15:08:57
【问题描述】:

我正在尝试使用 dplyr 来总结基于 2 个组的数据集:“年份”和“区域”。这是数据集的样子:

  Year   Area Num
1 2000 Area 1  99
2 2001 Area 3  85
3 2000 Area 1  60
4 2003 Area 2  90
5 2002 Area 1  40
6 2002 Area 3  30
7 2004 Area 4  10
...

最终结果应该是这样的:

  Year    Area Mean
1 2000 Area 1  100
2 2000 Area 2   80
3 2000 Area 3   89
4 2001 Area 1   80
5 2001 Area 2   85
6 2001 Area 3   59
7 2002 Area 1   90
8 2002 Area 2   88
... 

请原谅“平均值”的值,它们是编造的。

示例数据集的代码:

df <- structure(list(
   Year = c(2000, 2001, 2000, 2003, 2002, 2002, 2004), 
   Area = structure(c(1L, 3L, 1L, 2L, 1L, 3L, 4L), 
   .Label = c("Area 1", "Area 2", "Area 3", "Area 4"), 
   class = "factor"), 
   Num = structure(c(7L, 5L, 4L, 6L, 3L, 2L, 1L), 
   .Label = c("10", "30", "40", "60", "85", "90", "99"), 
   class = "factor")), 
   .Names = c("Year", "Area", "Num"), 
   class = "data.frame", row.names = c(NA, -7L))

df$Num <- as.numeric(df$Num)

我尝试过的事情:

df.meanYear <- df %>%
  group_by(Year) %>%
  group_by(Area) %>%
  summarize_each(funs(mean(Num)))

但它只是用平均值代替每个值,而不是预期的结果。

如果可能,请提供替代方法(即非 dplyr)方法,因为我还是 R 新手。

【问题讨论】:

  • 如果您想同时按年份和地区分组,请使用group_by(Year, Area) 而不是单独的group_by 语句。连续group_by 的结果与只运行最后一个相同。
  • 我想你想要df %&gt;% group_by(Year, Area) %&gt;% summarize(mean = mean(Num))。在基础R 中,您应该能够做到:aggregate(data = df, Num ~ Year + Area, mean)
  • df2 &lt;- ddply(df, .(Year, Area), summarize, Mean=mean(Num)) 这在 plyr 中不起作用吗?
  • @RTB 这是一个plyr 操作,不是dplyr,但它相当于@JasonAizkalns dplyr 代码。
  • 好的,我刚刚拍到了,谢谢!

标签: r


【解决方案1】:

这是你要找的吗?

 library(dplyr)
 df <- group_by(df, Year, Area)
 df <- summarise(df, avg = mean(Num))

【讨论】:

  • 是的!没有意识到 group_by 可以这样使用。
  • 我很好奇为什么它不适用于管道操作员
【解决方案2】:

我们可以使用data.table

library(data.table)
setDT(df)[, .(avg = mean(Num)) , by = .(Year, Area)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2018-08-03
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2021-07-27
    • 2017-07-18
    相关资源
    最近更新 更多