R - 如何将两个数据框拼接在一起?

169

给出两个数据框 ab

> a
           a           b           c
1 -0.2246894 -1.48167912 -1.65099363
2  0.5559320 -0.87898575 -0.15634590
3  1.8469466 -0.01487524 -0.53098215
4 -0.6875051  0.23880967  0.01824621
5 -0.6735163  0.75485292  0.44154092


> b
           a          c
1  0.4287284 -0.3295925
2  0.5201492  0.3341251
3 -2.6355570  1.7916780
4 -1.3645337  1.3642276
5 -0.4954542 -0.6660001

有没有简单的方法将它们连接起来,以返回下面形式的新数据框?

> new
           a                   b           c
1  -0.2246894   -1.48167912106676 -1.65099363
2   0.5559320  -0.878985746842256 -0.15634590
3   1.8469466 -0.0148752354840942 -0.53098215
4  -0.6875051   0.238809666690982  0.01824621
5  -0.6735163   0.754852923524198  0.44154092
6   0.4287284                  NA -0.32959248
7   0.5201492                  NA  0.33412510
8  -2.6355570                  NA  1.79167801
9  -1.3645337                  NA  1.36422764
10 -0.4954542                  NA -0.66600006

我想要合并数据框、匹配表头,并在数据框 b 中缺失表头的位置插入NA


5
我猜你已经尝试使用merge()了吧?为什么它不起作用? - Andrie
2
我不明白Andrie的意思 - 所以因为你让我感到困惑,我会给你+1! - Darren J. Fitzpatrick
21
我感到困惑。达伦的操作不是一个连接——没有“笛卡尔积”。相反,它是一个直接的串联。那么连接操作又有什么作用呢? - dfrankow
5个回答

270
你需要使用 "rbind" 函数。
b$b <- NA
new <- rbind(a, b)

rbind需要数据框具有相同的列。

第一行将列b添加到数据帧b中。

结果

> a <- data.frame(a=c(0,1,2), b=c(3,4,5), c=c(6,7,8))
> a
  a b c
1 0 3 6
2 1 4 7
3 2 5 8
> b <- data.frame(a=c(9,10,11), c=c(12,13,14))
> b
   a  c
1  9 12
2 10 13
3 11 14
> b$b <- NA
> b
   a  c  b
1  9 12 NA
2 10 13 NA
3 11 14 NA
> new <- rbind(a,b)
> new
   a  b  c
1  0  3  6
2  1  4  7
3  2  5  8
4  9 NA 12
5 10 NA 13
6 11 NA 14

14
如果你要合并两个以上的数据框,可以使用Reduce(rbind, list_of_data_frames)将它们全部合并在一起! - Yourpalal
1
如果您的 rbind 函数出现了奇怪的问题,可以尝试使用 rbind.data.frame 函数。 - Boern

37
你可以使用 dplyr 库中的函数 bind_rows(a,b)

3
cbind (rbind) 不同,如果存在字符向量,此函数不会将所有列(行)的类型更改为 factor - Azim

36

尝试使用plyr包:

rbind.fill(a,b,c)

11
避免在简单任务中使用外部程序包。 - Fernando
31
不必为了迎合rbind而添加额外的列,使用这种方法更加清晰和简便;这是正确的前进方式。如果plyr能提供适合的工具,避免使用极其常用的包是不明智的。 - Jack Aidley
2
这个函数会自动进行因子合并。它比被接受的答案要好得多。plyr是一个非常常见但不好的包。 - ABCD

14

这里是一个简单的小函数,它可以检测缺失的列并添加所有 NA,然后将两个数据集联结在一起。

无论出于什么原因,与使用 merge 函数相比,这种方法在处理大型数据集时返回速度更快。

fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}

2
这个小函数非常强大。 - Dirk
不错。我也想发同样的答案 :-) 。有一个改进:@Anton在他的答案中将NA转换为了double。如果新列的类型与其他数据框中现有列的类型相同,那就更好了。也许可以通过 mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]) 实现。但我不确定这是否是适当的方式。 - daniel.heydebreck

5
您可以使用rbind,但在这种情况下,您需要在两个表中具有相同数量的列,因此请尝试以下操作:
b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)

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