有可能行绑定两个没有相同列集的数据帧吗?我希望保留绑定后不匹配的列。
当前回答
data.table的替代方案:
library(data.table)
df1 = data.frame(a = c(1:5), b = c(6:10))
df2 = data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
rbindlist(list(df1, df2), fill = TRUE)
Rbind也可以在数据中工作。表中只要对象都转换为数据。表对象,所以
rbind(setDT(df1), setDT(df2), fill=TRUE)
也适用于这种情况。当您有几个数据时,这可能更可取。表,而不想构造列表。
其他回答
rbind.ordered=function(x,y){
diffCol = setdiff(colnames(x),colnames(y))
if (length(diffCol)>0){
cols=colnames(y)
for (i in 1:length(diffCol)) y=cbind(y,NA)
colnames(y)=c(cols,diffCol)
}
diffCol = setdiff(colnames(y),colnames(x))
if (length(diffCol)>0){
cols=colnames(x)
for (i in 1:length(diffCol)) x=cbind(x,NA)
colnames(x)=c(cols,diffCol)
}
return(rbind(x, y[, colnames(x)]))
}
也许我完全误解了您的问题,但是“我希望保留绑定后不匹配的列”使我认为您正在寻找类似于SQL查询的左连接或右连接。R具有合并函数,允许您指定左连接、右连接或内部连接,类似于SQL中的连接表。
关于这个主题已经有一个很好的问题和答案:如何连接(合并)数据帧(内部、外部、左、右)?
您也可以只取出公共列名。
> cols <- intersect(colnames(df1), colnames(df2))
> rbind(df1[,cols], df2[,cols])
如果df1中的列是df2中的列的子集(通过列名):
df3 <- rbind(df1, df2[, names(df1)])
最近的解决方案是使用dplyr的bind_rows函数,我认为它比smartbind更有效。
df1 <- data.frame(a = c(1:5), b = c(6:10))
df2 <- data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
dplyr::bind_rows(df1, df2)
a b c
1 1 6 <NA>
2 2 7 <NA>
3 3 8 <NA>
4 4 9 <NA>
5 5 10 <NA>
6 11 16 A
7 12 17 B
8 13 18 C
9 14 19 D
10 15 20 E