如何在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
相关产品推荐
相关产品推荐

