R-连接两个数据帧?


129

给定两个数据框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

我想合并数据框,匹配标题,并NAb缺少标题的数据框中插入位置。


3
我想你已经尝试过了merge()吗?为什么这样不起作用?
Andrie

2
我不是Andrie,所以我会为您+1 +1!
达伦·菲茨帕特里克

16
我很困惑。达伦(Darren)的行动不是联合-没有“笛卡尔积”。而是直接连接。那么联接如何提供帮助?
dfrankow 2011年

Answers:


225

您想要“ 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

9
如果要获得两个以上数据帧的并集,则可以Reduce(rbind, list_of_data_frames)将它们全部融合在一起!
Yourpalal 2015年

1
如果您rbind出于某些奇怪的原因而从基地来:我用过rbind.data.frame
布尔恩

34

尝试plyr软件包:

rbind.fill(a,b,c)

9
避免将外部软件包用于简单任务。
Fernando

23
比窃听更多的专栏文章更清晰,更轻松,只是为了使您感到满意;这是正确的前进方向。避免使用极为常见的程序包(例如plyr当它提供适当的工具来完成工作时)是不明智的。
杰克·艾德利

2
此功能自动进行因子合并。这比公认的答案要好得多。plyr是一个可怕的普通软件包。
HelloWorld


11

这是一个简单的小函数,在自动检测每个数据集缺少哪些列并将它们与all相加后,它将把两个数据集重新绑定在一起NA

无论出于何种原因,这回报MUCH上比使用大型数据集的速度更快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))
}

1
这个小功能是炸药。
德克(Dirk)

真好 我只想发布相同的答案:-)。一个改进:@Anton铸造的NA,以double他的答案。当新列的类型与另一个数据帧中现有列的类型相同时,这将是很好的。也许通过mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]])。但是我不确定这是否合适。
daniel.heydebreck

3

您可以使用,rbind但是在这种情况下,两个表中的列数必须相同,因此请尝试以下操作:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.