use*_*757 31 r data.table
我试图以类似的方式操作一些data.tables,并希望编写一个函数来实现这一目标.我想传入一个参数,其中包含将执行操作的列列表.当列的向量声明是:=运算符的左侧时,这可以正常工作,但如果先前声明(或传递给函数)则不行.以下代码显示了该问题.
dt = data.table(a = letters, b = 1:2, c=1:13)
colsToDelete = c('b', 'c')
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not.
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns
Run Code Online (Sandbox Code Playgroud)
错误是"添加新列'colsToDelete'然后分配NULL(删除它)." 很明显,它将'colsToDelete'解释为新的列名.
沿着这些方向做某事时会出现同样的问题
dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames]
Run Code Online (Sandbox Code Playgroud)
我是R的新手,但对其他语言更有经验,所以这可能是一个愚蠢的问题.
Aru*_*run 44
这基本上是因为我们允许LHS上的符号:=添加新列,以方便:ex : DT[, col := val]. 因此,为了将col自己的名称与存储在col列名中的内容区分开来,我们检查LHS是否为a name或expression.
如果是a name,它会在LHS上添加名称相同的列,如果是expression,则会对其进行评估.
DT[, col := val] # col is the column name.
DT[, (col) := val] # col gets evaluated and replaced with its value
DT[, c(col) := val] # same as above
Run Code Online (Sandbox Code Playgroud)
首选的习语是: dt[, (colsToDelete) := NULL]
HTH
为了扩展先前的答案,您可以通过引用删除列,方法是:
# delete columns 10 to 15
dt[ , (10:15) := NULL ]
Run Code Online (Sandbox Code Playgroud)
要么
# delete columns 3, 5 and 10 to 15
dt[ , (c(3,5,10:15)) := NULL ]
Run Code Online (Sandbox Code Playgroud)
我很惊讶没有提供使用该set()功能的答案。
set(DT, , colsToDelete, NULL)
Run Code Online (Sandbox Code Playgroud)
这应该是最简单的。