如何使用合并函数将两个数据框按列拼接?

7
假设我有两个数据框:
df1 <- data.frame(matrix(rnorm(10*10),ncol=10))
df2 <- data.frame(matrix(rnorm(10*10),ncol=10))
colnames(df1) <- 1:10
colnames(df2) <- 11:20

我该如何使用merge将这些数据列合并(我已经知道了cbind,但我对在此应用merge感兴趣)?

4
这里没有需要合并的内容。 - Matthew Lundberg
2个回答

7

除了行名称外,这里没有其他可合并的内容。

merge(df1, df2, by=0)

请注意结果中行的顺序!这些是按行名称字典排序的。为了获得正确的顺序,请使用order
x <- merge(df1, df2, by=0)
x[order(as.numeric(x$Row.names)),]

不错。但是为什么顺序会混乱呢?有没有办法保留行的顺序,就像使用 cbind 一样? - user2763361
我假设顺序是标记的词汇顺序。1 < 10 < 2 < 3... 可以通过在新的“名称”列上排序来固定顺序。我会将其添加到答案中。 - Matthew Lundberg
为什么我们不能合并行名? - user2763361
cbind()和merge()不是一回事!cbind用于连接列,例如:m <- cbind(1, 1:7)。要使用merge(),你需要有一个共同的键来连接两个列。如果你熟悉SQL,可以使用plyr包中的join()函数,这种方法更加直观。 - marbel
你实际上可以按行名称合并。我老是忘记这个。顺序仍然是一个问题。 - Matthew Lundberg

7

出于展示目的,我已将矩阵缩小。

> df1 <- data.frame(matrix(rnorm(15),ncol=3))
> df2 <- data.frame(matrix(rnorm(15),ncol=3))
> colnames(df1) <- paste0("A", 1:3)
> colnames(df2) <- paste0("B", 4:6)

我们有两个数据框df1和df2,它们的列名分别为A1、A2&A3和B1、B2&B3。
所以,正如您所知,cbind()函数仅仅把数据框依次连接在一起。
> cbind(df1, df2)
         A1        A2       A3        B4       B5        B6
1  2.055780  0.362796  1.25536 -1.748416  0.41855 -0.516635
2  0.010779  0.086778 -0.68413  1.183762 -1.20362  0.041147
3 -0.732393  0.235125 -0.89306  1.435362 -0.26066 -0.025933
4 -2.493843 -2.654263  0.36107  0.083018 -0.82251 -0.991135
5  0.935540  0.398196 -0.43043  0.470559 -0.54146  1.955555

merge()函数会查找共同的列。在这种情况下,没有共同的列,因此它实际上生成了一种外部乘积,其中df1的每一行与df2的每一行进行匹配。

> merge(df1, df2)
          A1        A2       A3        B4       B5        B6
1   2.055780  0.362796  1.25536 -1.748416  0.41855 -0.516635
2   0.010779  0.086778 -0.68413 -1.748416  0.41855 -0.516635
3  -0.732393  0.235125 -0.89306 -1.748416  0.41855 -0.516635
4  -2.493843 -2.654263  0.36107 -1.748416  0.41855 -0.516635
5   0.935540  0.398196 -0.43043 -1.748416  0.41855 -0.516635
6   2.055780  0.362796  1.25536  1.183762 -1.20362  0.041147
7   0.010779  0.086778 -0.68413  1.183762 -1.20362  0.041147
8  -0.732393  0.235125 -0.89306  1.183762 -1.20362  0.041147
9  -2.493843 -2.654263  0.36107  1.183762 -1.20362  0.041147
10  0.935540  0.398196 -0.43043  1.183762 -1.20362  0.041147
11  2.055780  0.362796  1.25536  1.435362 -0.26066 -0.025933
12  0.010779  0.086778 -0.68413  1.435362 -0.26066 -0.025933
13 -0.732393  0.235125 -0.89306  1.435362 -0.26066 -0.025933
14 -2.493843 -2.654263  0.36107  1.435362 -0.26066 -0.025933
15  0.935540  0.398196 -0.43043  1.435362 -0.26066 -0.025933
16  2.055780  0.362796  1.25536  0.083018 -0.82251 -0.991135
17  0.010779  0.086778 -0.68413  0.083018 -0.82251 -0.991135
18 -0.732393  0.235125 -0.89306  0.083018 -0.82251 -0.991135
19 -2.493843 -2.654263  0.36107  0.083018 -0.82251 -0.991135
20  0.935540  0.398196 -0.43043  0.083018 -0.82251 -0.991135
21  2.055780  0.362796  1.25536  0.470559 -0.54146  1.955555
22  0.010779  0.086778 -0.68413  0.470559 -0.54146  1.955555
23 -0.732393  0.235125 -0.89306  0.470559 -0.54146  1.955555
24 -2.493843 -2.654263  0.36107  0.470559 -0.54146  1.955555
25  0.935540  0.398196 -0.43043  0.470559 -0.54146  1.955555

如果我们将df1的第一列重新命名为与df2的第一列名称相同,则merge()函数会在这两个列中查找共同的值。由于这两个列没有共同的值,所以输出为空。
> colnames(df1)[1] = "B4"
> merge(df1, df2)
[1] B4 A2 A3 B5 B6
<0 rows> (or 0-length row.names)

如果我们现在将df2的第一列(倒序排列,只是为了让事情有趣!)复制到df1的第一列...

> df1$B4 = rev(df2$B4)
> df1
        B4       A2        A3
1 -0.50647 -0.48128  0.540799
2 -0.70684 -0.35401  0.872514
3  0.14341  1.12184 -0.079913
4 -0.59989  0.81912  1.726494
5  0.33864  0.85277  0.386702
> df2
        B4       B5        B6
1  0.33864  1.83677  0.406717
2 -0.59989 -0.43630  0.075029
3  0.14341  1.01496  0.095534
4 -0.70684  1.32414 -0.122613
5 -0.50647  0.70709 -0.700225

...并尝试再次合并...

> merge(df1, df2)
        B4       A2        A3       B5        B6
1 -0.70684 -0.35401  0.872514  1.32414 -0.122613
2 -0.59989  0.81912  1.726494 -0.43630  0.075029
3 -0.50647 -0.48128  0.540799  0.70709 -0.700225
4  0.14341  1.12184 -0.079913  1.01496  0.095534
5  0.33864  0.85277  0.386702  1.83677  0.406717

最终我们得到了一些有意义的东西:df1和df2的行被粘合在一起,根据df1 $B4中与df2 $B4匹配的值。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接