合并多个数据帧的列,根据列名覆盖值

时间:2017-04-28 11:02:15

标签: r dataframe merge

我有以下数据:

x<-data.frame(A=c(1,NA),B=c(NA,NA),C=c(NA,1))
   A  B  C
1  1 NA NA
2  NA NA  1

y<-data.frame(A=c(NA,0),C=c(NA,NA),D=c(NA,0))
   A  C  D
1 NA NA NA
2  0 NA  0

我希望以这种方式合并它们,同名的列被覆盖,优先于非NA值。此外,应添加不常见的列。

期望的结果:

  A  B  C  D
1 1 NA NA NA
2 0 NA  1  0

我的数据中的非NA值之间没有冲突。

2 个答案:

答案 0 :(得分:0)

你可以尝试:

library(dplyr)
library(magrittr)

full_join(x,y) %>%
      inner_join(y) %>%
      coalesce(full_join(x,y) %>%
                 inner_join(x))

给出:

  A  B  C  D
1 1 NA NA NA
2 0 NA  1  0

答案 1 :(得分:0)

这是一个基本的R方法,应该相当通用。

# fill in x NA values with values in y
x[] <- lapply(names(x), function(i) ifelse(is.na(x[,i]) & i %in% names(y), y[,i], x[,i]))

# add variables in y that are not in x and provide names to the variables
setNames(cbind(x, y[, !(names(y) %in% names(x))]), union(names(x), names(y)))
  A  B  C  D
1 1 NA NA NA
2 0 NA  1  0