我想使用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
中的值。因此,我们使用lapply
在list
上循环,然后将(:=
)分配给新列"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
这可以通过创建一些向量并将其放置在具有mget
的list
中来更加清楚
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