因此,我需要对data.table进行子集化和计算。我需要按动态变量进行子集设置,但我不断收到非数字到二进制的运算符错误。
data(mtcars)
mtcars=as.data.table(mtcars)
mtcars[vs!=am,qsec*-1] ##flip the qsec variable to negative if vs and am do not equal; this works because I directly call qsec
col_to_use='qsec'
mtcars[vs!=am,..col_to_use*-1] ##Error in col_to_use * -1 : non-numeric argument to binary operator
mtcars[vs!=am,..col_to_use] ##Shows the subset to change, everything looks okay.
我想念什么?
最好在.SDcols
一致性中指定它
mtcars[vs != am, .SD[[1]] * -1, .SDcols = col_to_use]
#[1] -16.46 -17.02 -19.44 -20.22 -20.00 -22.90 -18.30 -18.90 -20.01 -16.70 -14.50 -15.50 -14.60
或另一个选择是get
(可能与env有关)
mtcars[vs != am, get(col_to_use) * -1]
#[1] -16.46 -17.02 -19.44 -20.22 -20.00 -22.90 -18.30 -18.90 -20.01 -16.70 -14.50 -15.50 -14.60
或转换到symbol
和eval
审视你们
mtcars[vs != am, eval(as.symbol(col_to_use)) * -1]
#[1] -16.46 -17.02 -19.44 -20.22 -20.00 -22.90 -18.30 -18.90 -20.01 -16.70 -14.50 -15.50 -14.60
或利用.SD
列名
mtcars[vs != am, .SD[[col_to_use]] * -1]
#[1] -16.46 -17.02 -19.44 -20.22 -20.00 -22.90 -18.30 -18.90 -20.01 -16.70 -14.50 -15.50 -14.60
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句