【问题标题】:Calculate conditional mean in R with dplyr (like group by in SQL) [duplicate]使用 dplyr 计算 R 中的条件平均值(如 SQL 中的 group by)[重复]
【发布时间】:2016-03-13 07:02:06
【问题描述】:

我有一个包含城市列表和每日温度记录的数据框

data = data.frame(c("Chicago", "Chicago", "New York", "New York", "Denver"),
                  c(25, 36, 23, 24, 42))

我想添加第三列,即按城市划分的平均温度

avgtemp = c(30.5, 30.5, 23.5, 23.5, 42)

我曾尝试使用包dplyr 执行此操作,但没有成功。实现这一目标的最佳方法是什么,注意完整的数据集包含 50,000 行,因此我希望代码高效。

【问题讨论】:

  • “但没有成功”是什么意思?请显示尝试、错误消息等。
  • 如果值实际上是数字,请尝试ave(data[, 2], data[, 1])。 @CathG 已修复以匹配他们想要的输出。
  • 如果数据量大,性能有问题,可以试试data.table
  • 如果你想使用dplyr,你可以使用group_bymutate结合使用

标签: r dplyr


【解决方案1】:

我认为您正在寻找的(如果您想使用 dplyr)是 group_bymutate 功能的组合。

library(dplyr)
city <- c("a", "a", "b", "b", "c")
temp <- 1:5
df <- data.frame(city, temp)

df %>% group_by(city) %>% mutate(mean(temp))

哪个会输出:

    city  temp mean(temp)
  (fctr) (int)      (dbl)
1      a     1        1.5
2      a     2        1.5
3      b     3        3.5
4      b     4        3.5
5      c     5        5.0

顺便说一句,我认为 50,000 行对于 dplyr 来说并不是那么大的数据集。我不会太担心,除非这段代码将在某种循环中或者你有 1M+ 行。正如 Herka 在 cmets 中所建议的那样,在大多数情况下,就性能而言,data.table 是更好的选择。

编辑:删除了不必要的步骤

【讨论】:

  • 这很好,但是如何将平均值添加到数据框中?
  • mutate(mean(temp)) 部分是创建附加均值列的部分。我不确定我是否理解你的真正意思。原始数据框不受影响,因为没有分配。代码示例只是打印结果。 df &lt;- df %&gt;% group_by(city) %&gt;% mutate(mean(temp))
  • 如果我想将此列附加到原始数据框,我该怎么做?
  • df &lt;- df %&gt;% group_by(city) %&gt;% mutate(mean(temp))
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 2023-04-05
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2015-11-02
相关资源
最近更新 更多