条件划分和聚合

Conditional division and aggregation

考虑以下数据框:

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 中做到这一点?

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

基本逻辑是 merge/join 在 agg$dd$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