如何在data.table中按首尾列名删除指定列范围?
问题原因
在data.table中,子集筛选时的b:c是专门为列范围查询设计的语法糖,会直接解析为连续的列名范围。但在:=赋值操作的左侧(删除列的场景),该语法不被支持——此时b:c会被当作普通R表达式,尝试在全局环境中寻找名为b和c的对象,而非data.table内的列名,因此触发“找不到对象'b'”的错误。
解决方法
要通过列名范围语法删除列,需先将列名范围转换为字符向量,再通过括号包裹后传递给:=,以下是两种常用方法:
方法1:通过列名位置构建待删除列向量
library(data.table) d <- data.table(a = 1:3, b = 4:6, c = 7:9) # 获取b到c的列名向量 cols_to_remove <- names(d)[which(names(d) == "b"):which(names(d) == "c")] # 删除指定列 d[, (cols_to_remove) := NULL]
方法2:利用.SDcols简化操作
.SDcols支持列名范围语法,可先选中要删除的列,再将其赋值为NULL:
d[, (names(.SD)) := NULL, .SDcols = b:c]
执行后验证结果:
d # a # <int> # 1: 1 # 2: 2 # 3: 3
内容的提问来源于stack exchange,提问作者matto
相关产品推荐
相关产品推荐

