在R中给定行“匹配项”的情况下创建具有平均列值的表

时间:2019-12-12 21:24:02

标签: r

我希望有人可以帮助我解决这个问题。假设我必须处理以下数据帧。

      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

任何人都知道一小段代码可以帮助我吗?

3 个答案:

答案 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