如何仅绑定两个数据集的公共列

时间:2011-12-22 14:10:28

标签: r

我有2个数据帧,每个数据帧的列数不同。一些列在2个数据帧之间是通用的。如何才能将两个数据帧的公共列重新绑定到新的数据帧?

我尝试使用library(plyr);rbind.fill(A,B),但它会在不匹配的列中设置NA值,这对我没有帮助。

非常感谢 EC

3 个答案:

答案 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(...)))
}