在data.table中分配命名向量执行算术运算

时间:2017-01-26 10:37:58

标签: 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

列名称通过变量传递,因此是字符向量。有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

使用mget,我们会返回list输出,并且可以使用list访问lapply中的值。因此,我们使用lapply循环list,然后将其分配(:=)到新列'y3'和'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

通过创建一些向量并将其放在list mget

中,可以更清楚地做到这一点
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