Ответ 1
Вероятно, есть лучшие способы, но это то, что мне пришло в голову. Это использует аргумент roll=TRUE
. Идея состоит в том, чтобы сначала установить energy=0.0
где prospects < 0.27
:
field[prospects < 0.27, energy := 0.0]
Затем, если мы удалим значения NA из field
, мы можем использовать roll=TRUE
, выполнив объединение со всеми комбинациями следующим образом:
field[!is.na(energy)][CJ(c("a", "b"), 1:3), roll=TRUE][, prospects := field$prospects][]
# player time prospects energy
# 1: a 1 0.81 0.63
# 2: a 2 0.25 0.00
# 3: a 3 2.05 0.00
# 4: b 1 1.63 -0.28
# 5: b 2 2.20 -0.28
# 6: b 3 0.49 -0.28
Мы должны reset prospects
, потому что roll
тоже меняет. Вы могли бы сделать это лучше, но у вас есть идея.
Вариант, так что рулон выполняется только в столбце energy
:
field[!is.na(energy)][CJ(c("a", "b"), 1:3), list(energy),
roll=TRUE][, prospects := field$prospects][]
Или может быть проще использовать na.locf
из пакета zoo
:
field[time == 1, energy := round(rnorm(2),2)]
field[prospects < 0.27, energy := 0.0]
require(zoo)
field[, energy := na.locf(energy, na.rm=FALSE)]
который работает, если первая строка каждой группы гарантирована не-NA, которая здесь построена. Но если нет, вы также можете запустить na.locf по группе:
field[, energy := na.locf(energy, na.rm=FALSE), by=player]