我有2个数据帧,每个数据帧的列数不同。一些列在2个数据帧之间是通用的。如何才能将两个数据帧的公共列重新绑定到新的数据帧?
我尝试使用library(plyr);rbind.fill(A,B)
,但它会在不匹配的列中设置NA值,这对我没有帮助。
非常感谢 EC
答案 0 :(得分:26)
使用intersect
检索公共列。
dfr1 <- data.frame(x = 1:5, y = runif(5), z = rnorm(5))
dfr2 <- data.frame(w = letter[1:5], x = 6:10, y = runif(5))
common_cols <- intersect(colnames(dfr1), colnames(dfr2))
rbind(
subset(dfr1, select = common_cols),
subset(dfr2, select = common_cols)
)
正如评论中所指出的,你可以用
替换最后一行rbind(
dfr1[, common_cols],
dfr2[, common_cols]
)
用于小型性能和打字改进。
rbind(
dfr1[common_cols],
dfr2[common_cols]
)
也有效,但我认为它不太清楚。
答案 1 :(得分:2)
这是我的解决方案希望我的问题是正确的
df1 <- data.frame(a=rnorm(100), b=rnorm(100), not=rnorm(100))
df2 <- data.frame(a=rnorm(100), b=rnorm(100))
bind1 <- bind1 <- df1[, names(df1) %in% names(df2)]
bind2 <- bind1 <- df1[, names(df2) %in% names(df1)]
rbind(bind1, bind2)
答案 2 :(得分:0)
为我的个人软件包创建了自己的函数:(这适用于2个以上的数据帧)
<强>功能强>
Parent.fun
致电+示例数据:
fast.rbind <- function(...,method=c("fill","common"),value=NA){
if("fill"==method[1]) {
fun1 <- function(x,y,value=NA){
x[setdiff(colnames(y),colnames(x))] <- value
y[setdiff(colnames(x),colnames(y))] <- value
return(rbind(x,y))
}
}
if("common"==method[1]) {
fun1 <- function(x,y,value=NULL){
common_cols <- intersect(colnames(x), colnames(y))
return(rbind(x[, common_cols,drop=F],y[, common_cols,drop=F]))
}
}
return(Reduce(function(x,y){fun1(x=x,y=y,value=value)},list(...)))
}