求助:如何在data.table中以编程方式访问指定列?
嗨,我懂你这种动态列名访问data.table时踩坑的感觉!让我帮你把问题理清楚,再给你几个可行的解决办法。
首先,你代码里有个小笔误:你写的which = FALSE是错的,应该是with = FALSE——这个参数才是用来告诉data.table“不要把字符向量当成表达式,直接按列名来解析”的关键。
先看你测试数据的场景:
library(data.table) data <- data.table(test = 1:10, X201804_QTY = 11:20) col <- paste0(make.names(format(as.Date("2018-04-30"), "%Y%m")),"_QTY") # col的值是"X201804_QTY"
下面是几种正确的访问方式:
方法1:修正with参数的写法
这是最直接的修复,把你之前写错的which改成with就行:
data[, c("test", col), with = FALSE]
当with=FALSE时,data.table会把传入的字符向量直接当作列名列表来处理,就能正确选中test和动态生成的X201804_QTY列。
方法2:用get()函数获取列
如果你想用.()的形式来构造结果,可以用get()函数来取出变量对应的列:
# 基础用法(列名会变成get(col)) data[, .(test, get(col))] # 保留原列名的写法 data[, .(test, !!col := get(col))]
这里的!!是用来把变量col的内容“展开”成列名,避免被当成字面量处理。
方法3:用.SDcols指定列
如果你需要对选中的列做后续操作,.SDcols会很方便:
data[, .SD, .SDcols = c("test", col)]
.SD代表数据的子集,.SDcols用来指定要包含的列,这样也能精准选中你需要的动态列。
为什么你之前的方法不行?简单来说,data.table的j参数默认是在数据自身的环境里求值的——你直接写col的话,它会去数据里找名为col的列,而不是用变量col的值作为列名。上面的几种方法都是绕开这个默认行为,让data.table正确识别动态生成的列名。
内容的提问来源于stack exchange,提问作者Sven
相关产品推荐
相关产品推荐

