我正在尝试找到一种有效的(运行速度快,编码简单)的方法来执行rbind.fill
函数,但是要在base R中进行。从我的搜索看来,似乎有很多库函数,例如{{ 1}},smartbind
和bind_rows
上的rbind
,但是,如前所述,我需要在基本R中找到解决方案。我发现使用:
data.table
从this question的答案中删除,但我希望添加df3 <- rbind(df1, df2[, names(df1)])
填充的额外列。
编辑如果此方法也适用于空的NA
和填充的方法,那也很好,本质上就是设置返回填充的方法。 (这是为了简单起见,但是如果不可能的话,如果变量为空,只需用新的data.frame
替换变量就不难了。
EDIT2 我也希望它通过列名绑定为标记为相同的列。此外,第一个数据帧可以大于或小于第二个数据帧,并且两个数据帧都可以具有列,而另一个则不具有。
EDIT3 正如评论中所建议的,这是我想要的示例输入和输出(我只是在计算它们并不重要的数字)。
data.frame
虽然我一直在使用R,但它对我来说仍然相对较新,因此尽管我一直在考虑使用{{1} }与#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
和intersect
一起使用,并尝试首先仅绑定那些列,然后以某种方式添加其他列,但是我不确定如何从这里/实际实现它以“ R”方式...
答案 0 :(得分:1)
我不知道它的效率如何,但是一种简单的编码方式是将缺失的列添加到每个数据帧,然后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
答案 1 :(得分:1)
只需使用rbind.fill
。如果您无法安装plyr
软件包,请取出所需的零件。
rbind.fill
似乎很少有内部依赖项:plyr::compact
是单行的,plyr:::output_template
依赖于plyr:::allocate_column
,但乍一看似乎就是全部基本代码。因此,复制这4个功能(归因于来源,并确保许可证与您的使用兼容-CRAN上的当前版本使用非常许可的MIT许可证,您只需要保持MIT许可证)即可, rbind.fill
的实际实现。
为什么要采用这种方法?因为,正如亚伦指出的那样-您知道有效。它已经使用和调试了多年。