从R data.table中删除多个列,其中包含要删除的列的参数

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 nameexpression.

如果是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


raf*_*ira 6

为了扩展先前的答案,您可以通过引用删除列,方法是:

# 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)

  • 除此之外,您还可以执行 dt[ , -(10:15) ] 或 dt[ , -c(3,5,10:15)] (2认同)

Jfl*_*fly 5

我很惊讶没有提供使用该set()功能的答案。

set(DT, , colsToDelete, NULL)
Run Code Online (Sandbox Code Playgroud)

这应该是最简单的。

  • @wolfsatthedoor空参数是`i`参数,它引用行。由于省略了它,所以它表示** all **行将被更新。 (3认同)
  • 连续两个逗号? (2认同)