【问题标题】:Bind aggregation object to original dataframe [duplicate]将聚合对象绑定到原始数​​据框[重复]
【发布时间】:2013-01-26 17:09:08
【问题描述】:

我有一个用于聚合的 data.frame,它由 plyr 的ddply 完成。现在的目标是编写一个函数,将聚合对象自动绑定到原始数​​据。问题是,可以有多个聚合变量。

以下是一个只有一个聚合变量的例子:

这里是我的数据框:

  M O
1 1 6 
2 2 7 
3 2 4 
4 1 6 

然后使用ddply 我得到“O”的聚合:

TEST <- ddply(.data = DF,
              .variables = c("M"),
              .fun = summarise,
              NEW = sum(O))

结果如下:

  M NEW
1 1  12
2 2  11

我现在想做的是编写一个函数,使我能够将变量“New”绑定到原始 data.frame。

在循环中,它适用于:

for(i in 1:nrow(TEST)) {
  DF$New[DF$M == TEST$M[i]] <- TEST$NEW[i]
  } 

  M O New
1 1 6  12 
2 2 7  11 
3 2 4  11 
4 1 6  12 

现在我想把它转换成一个函数,即使有多个聚合变量,它也能提供等效的输出。

【问题讨论】:

  • 只需使用transform 而不是summarise
  • 如果您将summarise 替换为transform 作为答案并接受它会更好。
  • @Tyler 我会的!谢谢!

标签: r aggregate


【解决方案1】:

您可以在基础 R 中使用 avewithin 并添加多个列,如下所示。假设您的 data.frame 被称为“mydf”:

within(mydf, {
  P <- ave(O, M, FUN = sum)
  Q <- ave(O, M, FUN = mean)
})
#   M O   Q  P
# 1 1 6 6.0 12
# 2 2 7 5.5 11
# 3 2 4 5.5 11
# 4 1 6 6.0 12

当然,更好的是data.table 包:

library(data.table)
DT <- data.table(mydf)
DT[, `:=`(SUM = sum(O), MEAN = mean(O)), by = "M"]
DT
   M O SUM MEAN
1: 1 6  12  6.0
2: 2 7  11  5.5
3: 2 4  11  5.5
4: 1 6  12  6.0

【讨论】:

  • 这是ave+1的完美使用
【解决方案2】:

就像我在评论中所说的:

ddply(.data = DF,
      .variables = c("M"),
      .fun = transform,
       NEW = sum(O))
  M O NEW
1 1 6  12
2 1 6  12
3 2 7  11
4 2 4  11

【讨论】:

  • 谢谢!这既简单又有用!
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多