r-在data.table中通过指定命名向量执行算术运算



我想使用data.table中的赋值运算符创建新列,将现有列除以一定数量。由于表达式的性质,我尝试的代码抛出了一个二进制运算符错误。

以下是我要做的:

DT <- data.table(x1=1:4,x2=5:8,x3=9:12)
DT[, c("y1","y2") := mget(c("x1","x2"))]  # works as expected
DT[, c("y3","y4") := mget(c("x1","x2"))/2]  # Error in mget(c("x1", "x2"))/2 : non-numeric argument to binary operator

列名是通过变量传递的,因此是字符向量。有其他方法吗?

通过使用mget,我们返回list输出,并且可以使用lapply访问list中的值。因此,我们使用lapplylist上循环,然后将(:=)分配给新列"y3"one_answers"y4">

DT[, c("y3","y4") := lapply(mget(c("x1","x2")), `/`, 2)]  

然而,data.table语法将指定.SDcols中的列

DT[, c("y3","y4") := lapply(.SD, `/`, 2), .SDcols = x1:x2]  
DT
#   x1 x2 x3  y3  y4
#1:  1  5  9 0.5 2.5
#2:  2  6 10 1.0 3.0
#3:  3  7 11 1.5 3.5
#4:  4  8 12 2.0 4.0

这可以通过创建一些向量并将其放置在具有mgetlist中来更加清楚

z1 <- 1:4
z2 <- 5:8
mget(paste0("z", 1:2)) 
#$z1
#[1] 1 2 3 4
#$z2
#[1] 5 6 7 8
mget(paste0("z", 1:2)) /2
#Error in mget(paste0("z", 1:2))/2 : 
# non-numeric argument to binary operator

当使用lapply/sapply时,我们循环通过list元素,然后除以2

lapply(mget(paste0("z", 1:2)),  `/`, 2)
#$z1
#[1] 0.5 1.0 1.5 2.0
#$z2
#[1] 2.5 3.0 3.5 4.0

最新更新