rbind.fill 但在基础 R 中
rbind.fill but in base R
我正在尝试找到一种有效的(在 运行 中快速且编码简单)的方法来执行 rbind.fill
函数,但在基础 R 中。从我的搜索中,似乎有很多smartbind
、bind_rows
和 data.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 指出的那样 - 您 知道 它有效。它已经使用和调试多年。
我正在尝试找到一种有效的(在 运行 中快速且编码简单)的方法来执行 rbind.fill
函数,但在基础 R 中。从我的搜索中,似乎有很多smartbind
、bind_rows
和 data.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 指出的那样 - 您 知道 它有效。它已经使用和调试多年。