rbind.fill,但位于基本R

时间:2018-08-07 15:21:28

标签: r rbind

我正在尝试找到一种有效的(运行速度快,编码简单)的方法来执行rbind.fill函数,但是要在base R中进行。从我的搜索看来,似乎有很多库函数,例如{{ 1}},smartbindbind_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”方式...

2 个答案:

答案 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的实际实现。

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