Похоже, вы пишете data.table
код, так что вам повезло! Функция shift
- это то, что вам нужно:
DT[ , ColumnB := shift(ColumnA, type = 'lead')]
Поскольку вы проводите некоторый анализ с shift
, обязательно посмотрите также другие связанные функции, которые data.table
может предложить: nafill
, frollsum
/ frollmean
/ froll
, et c.
Относительно того, почему ваш код не работает:
c(NA, ColumnA[.I + 2])
Первый элемент NA
; следующее - это векторное подмножество ColumnA
с индексами .I+2
. .I + 2
- это все элементы .I
, сдвинутые на 2
. .I
имеет ту же длину, что и ColumnA
, поэтому ColumnA[.I + 2]
также будет иметь ту же длину, что и ColumnA
- следовательно, c(NA, ColumnA[.I + 2])
имеет на один элемент больше, чем ColumnA
.
Вот почему вы видите в своей ошибке непоследовательную заметку:
Поставлено 18391 предметов для назначения 18390 предметов
Если вы хотите сделать подход подмножества (который будет медленнее), вы можете сделать:
DT[ , ColumnA := c(NA, ColumnA[-1L])]
ColumnA[-1L]
это ColumnA
, минус первый элемент, следовательно, есть На один элемент меньше, чем в ColumnA
, и когда мы объединяем с NA
, мы получаем правильное число.