Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何仅检索两个数据集的公共列_R - Fatal编程技术网

R 如何仅检索两个数据集的公共列

R 如何仅检索两个数据集的公共列,r,R,我有两个数据帧,每个数据帧的列数不同。两个数据帧之间的某些列是公用的。如何仅将两个数据帧的公共列绑定到新数据帧 我尝试了库(plyr);rbind.fill(A,B)但是它在不匹配的列中设置NA值,这对我没有帮助 非常感谢 EC使用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

我有两个数据帧,每个数据帧的列数不同。两个数据帧之间的某些列是公用的。如何仅将两个数据帧的公共列绑定到新数据帧

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

非常感谢
EC

使用
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]
)

同样有效,但我觉得有点不太清楚。

这是我的解决方案,希望我把你的问题答对了

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)

df1为我的个人软件包创建了自己的功能:(这也适用于2个以上的数据帧)

功能:

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(...)))
}
df1 <- mtcars[1:5,1:4]
df2 <- mtcars[6:10,2:5]
df3 <- mtcars[11:15,4:7]
fast.rbind(df1,df2,df3,method="common")
fast.rbind(df1,df2,df3,value="yourDesiredFill")

fast.r如果
df2
中的列不在
df1
中,则会发生什么情况?此外,不需要调用
子集
。如果您以后要使用索引,那么您可以将由%names(df2)
中的
names(df1)%创建的逻辑向量传递给它们。至于您的第一条评论:如果df2有不在df1中的列,它们不常见,我不想过滤它们,或者我错了?至于你的第二个评论:对,这会更好,可能我做得有点太草率了……如果它们在df2中,但不在df1中,它们并不常见,所以你确实想过滤它们。我的观点是%
中的
%不是对称的,而
intersect
是对称的。您需要非常简洁易懂的
bind1+1此处无需使用子集-通常,您希望避免使用任何使用非标准求值的函数进行编程。(我不确定您为什么要使用它,因为它与
dfr1[common\u cols]
相比相当冗长)
df1 <- mtcars[1:5,1:4]
df2 <- mtcars[6:10,2:5]
df3 <- mtcars[11:15,4:7]
fast.rbind(df1,df2,df3,method="common")
fast.rbind(df1,df2,df3,value="yourDesiredFill")