在R语言中从不同数据框优雅选取指定列的方法
合并筛选指定变量生成新数据框
原始数据框定义
set.seed(123) df1 <- data.frame(var1 = sample(c(0,1), replace=TRUE, size=500), var2 = sample(c(0,1,99), replace=TRUE, size=500), var3 = sample(c(0,1,2), replace=TRUE, size=500), var4 = sample(c(0,1,3), replace=TRUE, size=500), var5 = sample(c(0, 1, 2, 3), replace=TRUE, size=500)) df2 <- data.frame(var6 = sample(c(0,1,3), replace=TRUE, size=500), var7 = sample(c(0,1,2), replace=TRUE, size=500), var8 = sample(c(0,1), replace=TRUE, size=500), var9 = sample(c(0,1), replace=TRUE, size=500), var10 = sample(c(0, 1, 2, 3), replace=TRUE, size=500))
需求说明
需要从上述两个数据框中选取var2、var6、var9、var4和var10这几个变量,生成新的数据框df3。
初始实现(存在小错误)
最初的写法分三步筛选再合并,但代码里merge时误写为合并两次selected_df1,正确写法应该是合并selected_df1和selected_df2:
selected_df1 <- df1 |> dplyr::select(var2, var4) selected_df2 <- df2 |> dplyr::select(var6, var9, var10) df3 <- merge(selected_df1, selected_df2) # 修正原代码中的重复合并问题
注意:这里merge在无共同匹配列时会生成笛卡尔积(250000行),和原数据框按行对应合并的预期不符,属于逻辑问题。
优化实现方案
方案1:按行绑定后筛选(高效且符合预期)
因为两个数据框行数完全一致,直接按行绑定列再筛选是最合理的方式:
library(dplyr) df3 <- bind_cols(df1, df2) |> select(var2, var4, var6, var9, var10)
方案2:先分别筛选再绑定(单管道语句实现)
如果想先完成各数据框的筛选再合并,也可以用管道在一条语句里完成:
df3 <- list(df1 |> select(var2, var4), df2 |> select(var6, var9, var10)) |> bind_cols()
方案3:Base R 单语句实现(无需依赖dplyr)
如果不想使用dplyr包,用原生R代码也能快速实现:
df3 <- data.frame(df1[c("var2", "var4")], df2[c("var6", "var9", "var10")])
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

