R получая следующее значение текущего столбца - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть data.table как:

DT = data.table(ColumnA = c(1.51, 1.86, 3.54, 3.79, 7.7))

Я пытаюсь создать ColumnB, который содержит следующее значение ColumnA:

    columnA      ColumnB  

     1.51          1.86
     1.86          3.54   
     3.54          3.79
     3.79          7.70
     7.70

Я попробовал следующее и это работало, однако теперь это не работает:

          ``` DT[, ColumnB:=c(NA,ColumnA[.I + 2]) ]```

Я получаю эту ошибку:

Ошибка в .Call (): предоставлено 18391 элементов для назначения до 18390 наименований столбца 'ColumnB'. Если вы sh хотите «переработать» RHS, используйте rep (), чтобы прояснить это намерение читателям вашего кода.

1 Ответ

5 голосов
/ 01 апреля 2020

Похоже, вы пишете 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, мы получаем правильное число.

...