【问题标题】:Conditional division and aggregation条件分割和聚合
【发布时间】:2020-04-15 10:05:13
【问题描述】:

考虑以下数据框:

d <- data.frame(a = c("01","02"),
                b = c(100,200),
                c = c(200,400))

还有如下数据框:

agg <- data.frame(d = c("01","01","02","02"),
                  e = c("V1","V2","V1","V3"))

我想使用agg 更改d 中的a 列。也就是说,如果a = 01,那么它应该改为V1等等。但是,在某些情况下,d 中的一些 a 会在 agg 中的 e 中出现多个名称。例如,0102 都进入V1。在这种情况下,我想计算平均值。也就是说,我希望我的最终数据集是这样的:

    a   b    c    
1   V1  150  300
2   V2  100  200
3   V3  200  400

可以看出,V10102 的平均值。

如何在 R 中做到这一点?

【问题讨论】:

  • 我想象的基本逻辑是在agg$d-to-d$a 上合并/加入 - 然后在合并后通过e 聚合结果。
  • 您能告诉我如何回答吗?抱歉,如果这看起来合乎逻辑。
  • 我猜aggregate(. ~ e,merge(agg, d, by.x = 'd', by.y = 'a'), mean)应该这样做?

标签: r aggregate division


【解决方案1】:

无聊的旧基础 R 答案。如评论:

基本逻辑是在agg$d-to-d$a 上合并/加入 - 然后在合并后通过e 聚合结果。

aggregate(cbind(b,c) ~ e, data=merge(agg, d, by.x="d", by.y="a"), FUN=mean)
#   e   b   c
#1 V1 150 300
#2 V2 100 200
#3 V3 200 400

dplyr 世界中,同样适用:

library(dplyr)
agg %>% 
  left_join(d, by=c("d"="a")) %>%
  select(-d) %>%
  group_by(e) %>%
  summarise_all(list(mean))
## A tibble: 3 x 3
#  e         b     c
#  <fct> <dbl> <dbl>
#1 V1      150   300
#2 V2      100   200
#3 V3      200   400

data.table 是很好的衡量标准:

library(data.table)
setDT(d)
setDT(agg)
d[agg, on="a==d"][, lapply(.SD, mean), by=e, .SDcols=-"a"]
#    e   b   c
#1: V1 150 300
#2: V2 100 200
#3: V3 200 400

【讨论】:

  • 我收到以下错误:“变量 'e' 的类型(列表)无效”。我的 e 列是“字符”(我认为这是问题所在)。我无法将其更改为“数字”,因为它不是数字。如何更改“聚合”代码,使其正常工作?提前致谢。
  • 从该错误消息的外观来看,'e' 有一个 list 列。你能先做df$e &lt;- unlist(df$e)吗?没有你的实际数据很难说。
猜你喜欢
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多