我希望有人可以帮助我解决这个问题。假设我必须处理以下数据帧。
A B C D
1 1 1 10 100
2 2 1 30 200
3 1 2 30 200
4 2 2 10 400
A B C D
1 1 1 10 300
2 2 1 20 400
3 1 2 30 300
4 2 2 20 600
我想要的结果是创建一个合并的帧,并在C和D列中提供平均值,并给出A和B列中值的完全组合,从而生成一个如下所示的帧:
A B C D
1 1 1 10 200
2 2 1 25 300
3 1 2 30 250
4 2 2 15 500
任何人都知道一小段代码可以帮助我吗?
答案 0 :(得分:6)
一个base R
选项可能是:
aggregate(cbind(C, D) ~ ., FUN = mean, data = rbind(df1, df2))
A B C D
1 1 1 10 200
2 2 1 25 300
3 1 2 30 250
4 2 2 15 500
答案 1 :(得分:3)
我使用图书馆tidyverse
:
df1 <- data.frame(A = c(1,2,1,2), B = c(1,1,2,2), C = c(10,30,30,10), D = c(100,200,200,400))
df2 <- data.frame(A = c(1,2,1,2), B = c(1,1,2,2), C = c(10,20,30,20), D = c(300,400,300,600))
rbind(df1,df2) %>% group_by(A,B) %>% summarise(meanC = mean(C), meanD = mean(D)) %>% ungroup()
结果:
# A tibble: 4 x 4
A B meanC meanD
<dbl> <dbl> <dbl> <dbl>
1 1 1 10 200
2 1 2 30 250
3 2 1 25 300
4 2 2 15 500
答案 2 :(得分:1)
您可以对df1的副本执行data.table更新联接。
library(data.table)
setDT(df1)
setDT(df2)
copy(df1)[df2, on = .(A, B),
c('C', 'D') := Map(function(x, y) (x + y)/2, .(C, D), .(i.C, i.D))][]
# A B C D
# 1: 1 1 10 200
# 2: 2 1 25 300
# 3: 1 2 30 250
# 4: 2 2 15 500