使用.SD与重命名变量组合时,如何避免.SD列名被添加前缀?
在data.table中一步完成编程式选列+硬编码重命名选列(避免.SD前缀)
你碰到的这个.SD列自动加前缀的问题,本质是因为把.SD作为单个列表元素传入导致的——.SD本身是个data.table,当它作为嵌套元素存在时,data.table会给它的列加上.SD.前缀来标识层级。下面给你两种一步到位的解决方法:
方法1:用c()合并.SD与新列(更灵活)
不要把.SD单独放在.()里,而是用c()把.SD的列和你要重命名的列平级合并,这样就不会出现前缀了:
library(data.table) dt <- as.data.table(mtcars)[1:5] my_vars <- c("cyl", "vs") # 正确写法 dt[, c(.SD, .(z = gear)), .SDcols = my_vars]
运行后输出:
cyl vs z 1: 6 0 4 2: 6 0 4 3: 4 1 4 4: 6 1 3 5: 8 0 3
方法2:用命名向量+..前缀(适合批量映射)
如果你偏好提前定义所有需要的列(包括重命名映射),可以像你尝试的那样构建一个命名向量,然后用..前缀告诉data.table去全局环境找这个向量:
all_vars <- c(my_vars, z = "gear") dt[, ..all_vars]
输出结果:
cyl vs gear 1: 6 0 4 2: 6 0 4 3: 4 1 4 4: 6 1 3 5: 8 0 3
补充说明:为什么原来的写法会加前缀?
当你写dt[, .(.SD, z = gear), .SDcol = my_vars]时,你创建的是一个包含两个元素的列表:第一个元素是.SD(完整的data.table对象),第二个是z = gear。data.table处理这种嵌套结构时,会给嵌套data.table的列加上.SD.前缀,用来区分不同层级的元素。而c(.SD, .(z = gear))会把.SD的列拆成单个列表元素,和z列合并成扁平列表,自然就不会有前缀了。
内容的提问来源于stack exchange,提问作者mnist
相关产品推荐
相关产品推荐

