R data.table中无法调用刚创建的obs列赋值的问题咨询
解决data.table中同一赋值语句无法引用新创建列的问题
错误原因
在data.table的同一个:=调用中,所有新列是同时计算的——此时刚定义的obs列还未被添加到数据表的环境中,所以window列的计算代码找不到obs对象,触发报错。
解决方案
方案1:链式分步骤赋值
先创建obs列,再基于它生成window列,链式写法更简洁:
library(data.table) set.seed(0) dt <- data.table( index = sample(0:100, 10, replace=FALSE), value = 1:100) # 先创建obs列,再生成window列 dt[, obs := seq_along(index)-1][, window := floor(obs/10)]
方案2:直接复用obs的计算表达式
如果逻辑简单,可直接在window的计算中复用生成obs的代码,避免依赖新列:
library(data.table) set.seed(0) dt <- data.table( index = sample(0:100, 10, replace=FALSE), value = 1:100) dt[, `:=`( obs = seq_along(index)-1, window = floor((seq_along(index)-1)/10) )]
方案3:用临时变量封装复杂逻辑
如果obs的计算逻辑复杂,不想重复写代码,可以先定义临时变量,再一次性完成赋值:
library(data.table) set.seed(0) dt <- data.table( index = sample(0:100, 10, replace=FALSE), value = 1:100) dt[, { obs_val <- seq_along(index)-1 .(obs = obs_val, window = floor(obs_val/10)) }]
内容的提问来源于stack exchange,提问作者sahuno
相关产品推荐
相关产品推荐

