请考虑以下数据框:
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"))
我想使用a
更改d
中的agg
列。也就是说,如果a = 01
,则应将其更改为V1
,依此类推。但是,在某些情况下,a
中的某些d
在e
中的agg
中会使用多个名称。例如,01
和02
都进入V1
。在这种情况下,我想计算平均值。也就是说,我希望我的最终数据集是这样的:
a b c
1 V1 150 300
2 V2 100 200
3 V3 200 400
可以看出,V1
是01
和02
的平均值。
如何在R中做到这一点?
厌倦了旧的R答案。如评论:
[基本逻辑将在agg$d
到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世界中,同样适用:
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