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

如何在R的data.table中用get()获取任意多指定命名列?

解决data.table动态选择指定前缀列的问题

首先,我们先还原你的初始数据:

library(data.table)
V = data.table('x'=0, 'price1'=1:10, 'price2'=10:1)

你遇到的问题是想通过动态生成的列名(比如基于任意长度的J向量)来选择列,而get(paste0('price',j))无法生效——这是因为get()只能单次提取单个列(返回一个向量),没法批量处理多个列名。

这里有几种紧凑且通用的方法,完全适配J长度任意的场景:

方法1:使用..前缀(推荐,data.table v1.10.0+支持)

先构造目标列名的向量,然后用..前缀告诉data.table这是一个外部的列名向量:

# 假设J是任意长度的向量,比如这里J=1:2
J <- 1:2
target_cols <- paste0('price', J)

# 选择列
V[, ..target_cols]

方法2:使用with=FALSE(兼容旧版本data.table)

如果你的data.table版本比较旧,..前缀不生效,可以用with=FALSE参数,让data.table把传入的向量当作列名列表处理:

V[, target_cols, with = FALSE]

方法3:使用.SDcols(适合后续对列做操作的场景)

如果之后你还需要对选中的列做计算(比如求均值、求和),可以结合.SD和.SDcols:

# 仅选择列的话和前两种效果一致
V[, .SD, .SDcols = target_cols]

# 示例:对选中列求均值
V[, lapply(.SD, mean), .SDcols = target_cols]

不管用哪种方法,运行后都会得到你想要的结果:

price1 price2
 1:      1     10
 2:      2      9
 3:      3      8
 4:      4      7
 5:      5      6
 6:      6      5
 7:      7      4
 8:      8      3
 9:      9      2
10:     10      1

这些方法的核心思路都是先构造完整的目标列名向量,再让data.table直接识别这个向量来选择列,完美适配J长度任意的需求,不需要硬编码列号或列名。

内容的提问来源于stack exchange,提问作者wolfsatthedoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:00:38