r:当存在公共列时合并数据的有效方式,并且当没有公共列时合并数据

时间:2017-05-29 21:48:38

标签: r merge

我有两个包含重复列的数据框,data1data2。我现在正在运行for循环,每个循环将data1中的一列与data2中的整列合并。例如

DATA1:

1 1 3 4 4 
2 5 2 4 2
2 2 8 8 0

DATA2

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

columns 1 and 4data1data2中重复。对于第一个循环,它合并

1 
2 
2

data2

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

所以期望的结果是

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

然后转到second column

 1
 5
 2

并与data2

合并
    1 4 5 4 5
    2 9 3 4 5
    2 7 4 8 0

期望的结果将是

    1 1 4 5 4 5
    5 2 9 3 4 5
    2 2 7 4 8 0

我的想法是使用combinemerge函数,但这两个函数无法实现所需的输出

for(i in 1:dim(data[2])){
  datam_merge<- merge(data1[i], data2)
}

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

data3 <- dplyr::left_join(data2, data1)
head(data3)

left_join()函数确定哪些列data2与data1有共同点,然后只加入data1data2的不相似列。

我注意到您的“预期结果”正在从data1中删除第5列。这是故意的,还是您想要的输出是一个新的数据框,其中包含data1data2的所有列,没有任何重复项?

这是另一种可能是更通用的解决方案:

data3 <- dplyr::inner_join(data1, data2)

这只会加入两个数据帧之间的唯一列,而不仅仅是data1

请告诉我这是否是您要找的!

修改 这是我的例子:

data1 <- data.frame(c(1,2,2),c(1,5,2),c(3,2,8),c(4,4,8),c(4,2,0))
names(data1) <- c("A","B","C","D","E")
data2 <- data.frame(c(1,2,2),c(4,9,7),c(5,3,4),c(4,4,8),c(5,5,0))
names(data2) <- c("A","F","G","D","H")

## columns 'A' and 'D' are in common, but we only need one of each letter ('A' through 'E').
data3 <- left_join(data2, data1)
head(data3)
  A F G D H B C E
1 1 4 5 4 5 1 3 4
2 2 9 3 4 5 5 2 2
3 2 7 4 8 0 2 8 0