R data.table中能否对新创建的列使用shift()函数?
R data.table新创建列调用shift()问题解答
核心结论
不可以在同一个:=多列赋值语句中直接调用刚创建的其他列。
报错原因
data.table的:=操作符在同时赋值多个列时,所有赋值表达式是并行计算的,不会按书写顺序从左到右依次执行。你给出的示例中,d=shift(c,-1)执行时列c还未完成创建,因此会提示列c不存在,这和for循环顺序执行的逻辑有本质区别。
解决方案
方案1:拆分赋值步骤
先单独计算并创建列c,再在第二个:=语句中基于c计算d:
library(data.table) x <- data.table(a = c(1,2,3), b = c(4,5,6)) x[, c := a * b] x[, d := shift(c, -1)]
方案2:单语句内用大括号封装顺序计算
如果不想拆分赋值语句,可以通过大括号包裹逻辑,先计算出c的临时值,再同时返回两个列的结果完成一次性赋值:
library(data.table) x <- data.table(a = c(1,2,3), b = c(4,5,6)) x[, c("c", "d") := { c_val <- a * b .(c_val, shift(c_val, -1)) }]
内容的提问来源于stack exchange,提问作者R007
相关产品推荐
相关产品推荐

