有可能行绑定两个没有相同列集的数据帧吗?我希望保留绑定后不匹配的列。
当前回答
大多数基本R答案解决的情况是,只有一个data.frame有额外的列,或者结果data.frame有这些列的交集。由于OP写道,我希望在绑定后保留不匹配的列,因此使用基本R方法来解决这个问题的答案可能值得发布。
下面,我将介绍两个基本R方法:一个改变原始data.frames,另一个不改变。此外,我还提供了一种将非破坏性方法推广到两个以上的数据帧的方法。
首先,让我们获取一些示例数据。
# sample data, variable c is in df1, variable d is in df2
df1 = data.frame(a=1:5, b=6:10, d=month.name[1:5])
df2 = data.frame(a=6:10, b=16:20, c = letters[8:12])
两个数据帧,改变原始数据 为了在rbind中保留这两个data.frames中的所有列(并允许该函数正常工作而不会导致错误),您需要在每个data.frame中添加NA列,并使用setdiff填充适当的缺失名称。
# fill in non-overlapping columns with NAs
df1[setdiff(names(df2), names(df1))] <- NA
df2[setdiff(names(df1), names(df2))] <- NA
现在,rbind-em
rbind(df1, df2)
a b d c
1 1 6 January <NA>
2 2 7 February <NA>
3 3 8 March <NA>
4 4 9 April <NA>
5 5 10 May <NA>
6 6 16 <NA> h
7 7 17 <NA> i
8 8 18 <NA> j
9 9 19 <NA> k
10 10 20 <NA> l
注意,前两行更改了原始data.frames, df1和df2,将完整的列添加到这两行。
两帧数据,不要改变原始数据 为了保持原始的data.frames不变,首先遍历不同的名称,返回一个命名的na向量,这些na与data.frame使用c连接到一个列表中。然后data.frame将结果转换为rbind的适当data.frame。
rbind(
data.frame(c(df1, sapply(setdiff(names(df2), names(df1)), function(x) NA))),
data.frame(c(df2, sapply(setdiff(names(df1), names(df2)), function(x) NA)))
)
许多数据帧不会改变原始数据 在有两个以上data.frames的情况下,可以执行以下操作。
# put data.frames into list (dfs named df1, df2, df3, etc)
mydflist <- mget(ls(pattern="df\\d+"))
# get all variable names
allNms <- unique(unlist(lapply(mydflist, names)))
# put em all together
do.call(rbind,
lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))))
也许看不到原始data。frames的行名会更好一些?然后这样做。
do.call(rbind,
c(lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))),
make.row.names=FALSE))
其他回答
rbind。从包装胶合板填充可能是你正在寻找的。
您也可以只取出公共列名。
> cols <- intersect(colnames(df1), colnames(df2))
> rbind(df1[,cols], df2[,cols])
您可以将它们插入到原始数据库(db1)的末尾,并添加第二个数据库的行数。db2中不包括的列将显示NA值。
db1[nrow(db1)+1:nrow(db1)+nrow(db2), names(db2)] <- db2
只是为了文档。你可以用下面的形式尝试Stack库和它的函数Stack:
Stack(df_1, df_2)
我也有一个印象,对于大数据集,它比其他方法更快。
大多数基本R答案解决的情况是,只有一个data.frame有额外的列,或者结果data.frame有这些列的交集。由于OP写道,我希望在绑定后保留不匹配的列,因此使用基本R方法来解决这个问题的答案可能值得发布。
下面,我将介绍两个基本R方法:一个改变原始data.frames,另一个不改变。此外,我还提供了一种将非破坏性方法推广到两个以上的数据帧的方法。
首先,让我们获取一些示例数据。
# sample data, variable c is in df1, variable d is in df2
df1 = data.frame(a=1:5, b=6:10, d=month.name[1:5])
df2 = data.frame(a=6:10, b=16:20, c = letters[8:12])
两个数据帧,改变原始数据 为了在rbind中保留这两个data.frames中的所有列(并允许该函数正常工作而不会导致错误),您需要在每个data.frame中添加NA列,并使用setdiff填充适当的缺失名称。
# fill in non-overlapping columns with NAs
df1[setdiff(names(df2), names(df1))] <- NA
df2[setdiff(names(df1), names(df2))] <- NA
现在,rbind-em
rbind(df1, df2)
a b d c
1 1 6 January <NA>
2 2 7 February <NA>
3 3 8 March <NA>
4 4 9 April <NA>
5 5 10 May <NA>
6 6 16 <NA> h
7 7 17 <NA> i
8 8 18 <NA> j
9 9 19 <NA> k
10 10 20 <NA> l
注意,前两行更改了原始data.frames, df1和df2,将完整的列添加到这两行。
两帧数据,不要改变原始数据 为了保持原始的data.frames不变,首先遍历不同的名称,返回一个命名的na向量,这些na与data.frame使用c连接到一个列表中。然后data.frame将结果转换为rbind的适当data.frame。
rbind(
data.frame(c(df1, sapply(setdiff(names(df2), names(df1)), function(x) NA))),
data.frame(c(df2, sapply(setdiff(names(df1), names(df2)), function(x) NA)))
)
许多数据帧不会改变原始数据 在有两个以上data.frames的情况下,可以执行以下操作。
# put data.frames into list (dfs named df1, df2, df3, etc)
mydflist <- mget(ls(pattern="df\\d+"))
# get all variable names
allNms <- unique(unlist(lapply(mydflist, names)))
# put em all together
do.call(rbind,
lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))))
也许看不到原始data。frames的行名会更好一些?然后这样做。
do.call(rbind,
c(lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))),
make.row.names=FALSE))
推荐文章
- 在R中同一行打印字符串和变量内容
- 使用pandoc从Markdown转换为PDF时设置空白大小
- 使用pandas对同一列进行多个聚合
- ggplot2折线图给出“geom_path:每组只包含一个观测值。你需要调整群体审美吗?”
- 在Python Pandas中删除多个列中的所有重复行
- 将Pandas多索引转换为列
- 熊猫数据帧得到每组的第一行
- 导入文本文件为单字符字符串
- 为什么我的熊猫'应用'功能引用多列工作?
- 移除jupyter笔记本上的内核
- 提取一个dplyr tbl列作为向量
- 查找名称包含特定字符串的列
- 将空白值(空格)替换为pandas中的NaN
- 如何在R中绘制两个直方图?
- 显示/打印tibble的所有行(tbl_df)