我希望能够给一个变量赋值,然后使用该变量创建一个新的变量。 data.table
的语法支持多重赋值,但显然不能用于内部引用。 在我的实际用例中,“i”和“by”子句更加复杂,因此我不想像这样重复编写代码:
require(data.table)
dt <- data.table(
x = 1:5,
y = 2:6
)
# this works
dt[x == 3, z1 := x + y]
dt[x == 3, z2 := z1 + 5]
# but I wish this worked
dt[x == 3, `:=`(
z1 = x + y,
z2 = z1 + 5
)]
相比之下,dplyr 可以实现这个功能:
require(dplyr)
df <- data.frame(
x = 1:5,
y = 2:6
)
df <- mutate(df,
z1 = x + y,
z2 = z1 + 5
)
有没有一种使用data.table的简洁方法来做到这一点?
编辑: 稍微调整akrun的解决方案,我找到了一种保持易读的连续语法的方法。只需在列表外执行所有操作:
dt[x==3, c('z1','z2','z3') := {
z1 <- x+y
z2 <- z1 + 5
z3 <- z2 + 6
list(z1, z2, z3)
}]
dplyr
选项与data.table
不同,因为它没有过滤x==3
。在dplyr
中,我猜我们需要使用ifelse
或进行filter
,然后进行mutate
和left_join
,如果我没错的话,这应该是比较耗费资源的。 - akrun