条件划分和聚合
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
中出现多个名称。例如,01
和 02
都进入 V1
。在那种情况下,我想计算平均值。也就是说,我想要这样的最终数据集:
a b c
1 V1 150 300
2 V2 100 200
3 V3 200 400
可以看出,V1
是01
和02
的平均值。
我如何在 R 中做到这一点?
无聊的旧基础 R 答案。如评论:
基本逻辑是 merge/join 在 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世界,同样适用:
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
考虑以下数据框:
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
中出现多个名称。例如,01
和 02
都进入 V1
。在那种情况下,我想计算平均值。也就是说,我想要这样的最终数据集:
a b c
1 V1 150 300
2 V2 100 200
3 V3 200 400
可以看出,V1
是01
和02
的平均值。
我如何在 R 中做到这一点?
无聊的旧基础 R 答案。如评论:
基本逻辑是 merge/join 在 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世界,同样适用:
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