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")