按两列名称合并行数不相等的两个数据帧

Merging two dataframes with unequal numbers of rows by two columns names

我正在尝试合并行数和列数不相等的两个数据帧,比方说 A 和 B。它们有两个公共列,c1 和 c2。我知道一个数据框中存在的每个 c1 x c2 组合也存在于另一个数据框中,因此我不期望任何空值。 A 具有每个存在的 c1 x c2 组合的多个实例,而 B 具有每个 c1 x c2 组合的恰好一个实例。 rbind 和 merge 没有工作。

如果两个数据框是:

  c1 c2 c3 c4
1  A  1  5  1
2  B  2  4  2
3  B  1  3  4
4  A  2  3  4
5  A  1  3  3
6  B  2  1  8

  c1 c2 c5
1  A  1  5
2  B  2  4
3  B  1  3
4  A  2  8

然后我想以某种方式绑定 c1 和 c2 并生成:

  c1 c2 c3 c4 c5
1  A  1  5  1  5
2  B  2  4  2  4
3  B  1  3  4  3
4  A  2  3  4  8
5  A  1  3  3  5
6  B  2  1  8  4
A <- data.frame(c1=c('A','B','B','A','A','B'),c2=c(1,2,1,2,1,2),c3=c(5,4,3,3,3,1),c4=c(1,2,4,4,3,8),stringsAsFactors=F);
B <- data.frame(c1=c('A','B','B','A'),c2=c(1,2,1,2),c5=c(5,4,3,8),stringsAsFactors=F);
merge(A,B,c('c1','c2'));
##   c1 c2 c3 c4 c5
## 1  A  1  5  1  5
## 2  A  1  3  3  5
## 3  A  2  3  4  8
## 4  B  1  3  4  3
## 5  B  2  4  2  4
## 6  B  2  1  8  4

我们也可以使用来自 data.table 的连接和 on

library(data.table)
setDT(df1)[df2, on= c("c1", "c2")][order(c1)]
#   c1 c2 c3 c4 c5
#1:  A  1  5  1  5
#2:  A  1  3  3  5
#3:  A  2  3  4  8
#4:  B  2  4  2  4
#5:  B  2  1  8  4
#6:  B  1  3  4  3