有可能行绑定两个没有相同列集的数据帧吗?我希望保留绑定后不匹配的列。


当前回答

您可以在gtools包中使用smartbind。

例子:

library(gtools)
df1 <- data.frame(a = c(1:5), b = c(6:10))
df2 <- data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
smartbind(df1, df2)
# result
     a  b    c
1.1  1  6 <NA>
1.2  2  7 <NA>
1.3  3  8 <NA>
1.4  4  9 <NA>
1.5  5 10 <NA>
2.1 11 16    A
2.2 12 17    B
2.3 13 18    C
2.4 14 19    D
2.5 15 20    E

其他回答

也许我完全误解了您的问题,但是“我希望保留绑定后不匹配的列”使我认为您正在寻找类似于SQL查询的左连接或右连接。R具有合并函数,允许您指定左连接、右连接或内部连接,类似于SQL中的连接表。

关于这个主题已经有一个很好的问题和答案:如何连接(合并)数据帧(内部、外部、左、右)?

rbind.ordered=function(x,y){

  diffCol = setdiff(colnames(x),colnames(y))
  if (length(diffCol)>0){
    cols=colnames(y)
    for (i in 1:length(diffCol)) y=cbind(y,NA)
    colnames(y)=c(cols,diffCol)
  }

  diffCol = setdiff(colnames(y),colnames(x))
  if (length(diffCol)>0){
    cols=colnames(x)
    for (i in 1:length(diffCol)) x=cbind(x,NA)
    colnames(x)=c(cols,diffCol)
  }
  return(rbind(x, y[, colnames(x)]))
}

只是为了文档。你可以用下面的形式尝试Stack库和它的函数Stack:

Stack(df_1, df_2)

我也有一个印象,对于大数据集,它比其他方法更快。

gtools/smartbind不喜欢使用Dates,可能是因为它是as.vector。这是我的解决方案……

sbind = function(x, y, fill=NA) {
    sbind.fill = function(d, cols){ 
        for(c in cols)
            d[[c]] = fill
        d
    }

    x = sbind.fill(x, setdiff(names(y),names(x)))
    y = sbind.fill(y, setdiff(names(x),names(y)))

    rbind(x, y)
}

如果df1中的列是df2中的列的子集(通过列名):

df3 <- rbind(df1, df2[, names(df1)])