我想使用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
列名称通过变量传递,因此是字符向量。有没有其他方法可以做到这一点?
答案 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