rbind.fill 但在基础 R 中

rbind.fill but in base R

我正在尝试找到一种有效的(在 运行 中快速且编码简单)的方法来执行 rbind.fill 函数,但在基础 R 中。从我的搜索中,似乎有很多smartbindbind_rowsdata.table 上的 rbind 等库函数,不过,如前所述,我需要一个基于 R 的解决方案。我发现使用:

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

来自对 this question 的回答,但它删除了列,而我希望添加填充有 NA 的额外列。

EDIT 如果此方法适用于空 data.frame 和填充的方法,那也很好,本质上只是设置返回填充的方法。 (这是为了简单起见,但如果不可能的话,如果它是空的,用新的 data.frame 替换变量并不难。

EDIT2 我还希望它按列名称绑定到标记相同的列。此外,第一个数据框可以比第二个数据框更大或更小,并且两个数据框都可能有另一个没有的列。

EDIT3 正如评论所建议的,这是我想要的示例输入和输出(我只是编造了它们并不重要的数字)。

#inputs
a <- data.frame(aaa=c(1, 1, 2), bbb=c(2, 3, 3), ccc=c(1, 3, 4))
b <- data.frame(aaa=c(8, 5, 4), bbb=c(1, 1, 4), ddd=c(9, 9, 9), eee=(1, 2, 4))
#desired output
aaa bbb ccc ddd eee
1   2   1   NA  NA
1   3   3   NA  NA
2   3   4   NA  NA
8   1   NA  9   1
5   1   NA  9   2
4   4   NA  9   4

虽然我已经使用 R 几个星期了,但它对我来说还是比较新的,所以我还没有充分了解其机制以实际制定解决方案,尽管我一直在考虑使用 intersect 以某种方式使用 names(a)names(b) 并尝试首先仅绑定那些列,然后以某种方式添加其他列,但我不确定从这里去哪里/实际上如何以 'R' 的方式实施...

我不知道它的效率如何,但一种简单的编码方法是将缺失的列添加到每个数据框中,然后 rbind 在一起。

rbindx <- function(..., dfs=list(...)) {
  ns <- unique(unlist(sapply(dfs, names)))
  do.call(rbind, lapply(dfs, function(x) {
    for(n in ns[! ns %in% names(x)]) {x[[n]] <- NA}; x }))
}

a <- data.frame(aaa=c(1, 1, 2), bbb=c(2, 3, 3), ccc=c(1, 3, 4))
b <- data.frame(aaa=c(8, 5, 4), bbb=c(1, 1, 4), ddd=c(9, 9, 9), eee=c(1, 2, 4))
rbindx(a, b)

#   aaa bbb ccc ddd eee
# 1   1   2   1  NA  NA
# 2   1   3   3  NA  NA
# 3   2   3   4  NA  NA
# 4   8   1  NA   9   1
# 5   5   1  NA   9   2
# 6   4   4  NA   9   4

只需使用rbind.fill。如果无法安装 plyr 包,请拉出您需要的部分。

rbind.fill内部依赖似乎很少:plyr::compact是一行,plyr:::output_template依赖plyr:::allocate_column,但乍一看好像都是基本代码。所以复制这 4 个功能(注明来源并确保许可证与您的使用兼容 - CRAN 上的当前版本使用相当宽松的 MIT 许可证,您只需要保持 MIT 许可),然后您拥有rbind.fill.

的真正实现

为什么要采用这种方法?因为,正如 Aaron 指出的那样 - 您 知道 它有效。它已经使用和调试多年。