为什么我不能使用或改变 R data.table 中创建的新列?

sah*_*uno 3 r data.table

我想使用/改变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)

r2e*_*ans 7

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)

  • @MerijnvanTilborg 谢谢你,这对OP来说是一个很好的建议。此处不相关,但当我使用分组时,我倾向于使用“seq_along(.)”或“seq.int(.N)”,因为“.I”是全局的而不是每个组的。(有人建议添加“.i”(小写)作为每组行序列,不确定是否会添加。) (5认同)

lan*_*ang 6

您可以使用该{}选项来执行此操作。当您想要创建不想保留的中间列时,它可能更有用。

dt[, c("obs", "window"):={obs=seq_along(index)-1; window=floor(obs/10); .(obs, window)}]
Run Code Online (Sandbox Code Playgroud)