R语言data.table循环提取动态列时返回列名而非数据集如何解决
问题原因
这是data.table特有的j参数求值规则导致的:[.data.table的j参数默认会在数据表的环境内作为表达式求值,你传入的c('a', i)是字符向量,没有显式声明要取列的情况下,会直接返回该字符向量本身,也就是你看到的输出结果。
可行解决方案
以下几种写法都可以实现按字符向量选择列,返回你需要的data.table子集:
方法1:添加with = FALSE参数
这是最经典的兼容写法,添加该参数后,data.table会把j位置的字符向量识别为要选择的列名:
x <- c('b', 'c') for (i in x) { print( df[, c('a', i), with = FALSE] ) }
运行输出:
a b 1: 1 3 2: 2 4 a c 1: 1 5 2: 2 6
方法2:使用.SD + .SDcols参数
通过指定.SD的列范围实现子集选择:
for (i in x) { print( df[, .SD, .SDcols = c('a', i)] ) }
方法3:使用..前缀(适配新版本data.table)
较新的data.table版本支持在变量前加..前缀,标识该变量是从父环境调用的列名字符向量:
for (i in x) { print( df[, ..c('a', i)] ) }
内容的提问来源于stack exchange,提问作者Sweepy Dodo
相关产品推荐
相关产品推荐

