为何从data.table选取两个变量的代码未生效?
问题原因与解决办法
错误原因
在data.table的语法中,[]里的j参数(逗号右侧部分)默认会在数据.table的内部环境中解析。当你写c('CDID', variable)时,variable是外部定义的字符串变量,整个表达式会直接求值为字符向量c("CDID", "A9ER"),此时data.table会把这个向量本身作为结果返回,而非提取对应列名的列。
而直接写c('CDID', 'A9ER')时,data.table的解析器会识别这是字面量列名字符向量,自动处理为选择对应列的操作,因此返回包含两列的data.table。
正确写法
以下几种方式可以实现函数中动态选择CDID和指定变量的需求:
- 方式1:使用
..前缀..是data.table的语法糖,用于引用外部环境变量,告诉data.table将字符向量当作列名列表处理:
variable <- 'A9ER' data <- data[, ..c('CDID', variable)]
- 方式2:使用
with = FALSE参数
这是data.table早期就支持的参数,关闭内部环境解析,直接将字符向量作为列名选择依据:
variable <- 'A9ER' data <- data[, c('CDID', variable), with = FALSE]
- 方式3:使用
.SDcols.SD代表数据集子集,.SDcols指定要包含的列,适合更复杂的列选择场景:
variable <- 'A9ER' data <- data[, .SD, .SDcols = c('CDID', variable)]
内容的提问来源于stack exchange,提问作者Oleksandr Shepotylo
相关产品推荐
相关产品推荐

