You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:45:08