我想使用/改变obs我在 data.table 中创建的列,但返回错误
Error in eval(jsub, SDenv, parent.frame()) : object 'obs' not found
请参阅示例数据的实现。
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(obs/10))] #create an index of every observation and bin them
Run Code Online (Sandbox Code Playgroud)
data.table的:=运算符不允许在同一[表达式中引用最近添加/更改的变量。为了做你想做的事,你需要另一个[。
dt[, `:=`(obs = seq_along(index) - 1)
][, `:=`(window = floor(obs/10))]
# index value obs window
# <int> <int> <num> <num>
# 1: 13 1 0 0
# 2: 67 2 1 0
# 3: 38 3 2 0
# 4: 0 4 3 0
# 5: 33 5 4 0
# 6: 86 6 5 0
# 7: 42 7 6 0
# 8: 100 8 7 0
# 9: 81 9 8 0
# 10: 58 10 9 0
# ---
# 91: 13 91 90 9
# 92: 67 92 91 9
# 93: 38 93 92 9
# 94: 0 94 93 9
# 95: 33 95 94 9
# 96: 86 96 95 9
# 97: 42 97 96 9
# 98: 100 98 97 9
# 99: 81 99 98 9
# 100: 58 100 99 9
Run Code Online (Sandbox Code Playgroud)
由于这每个任务只执行一项任务[,因此我们可以选择将这些任务在视觉上减少到
dt[, obs := seq_along(index) - 1
][, window := floor(obs/10)]
Run Code Online (Sandbox Code Playgroud)
您可以使用该{}选项来执行此操作。当您想要创建不想保留的中间列时,它可能更有用。
dt[, c("obs", "window"):={obs=seq_along(index)-1; window=floor(obs/10); .(obs, window)}]
Run Code Online (Sandbox Code Playgroud)