Присоедините таблицу к себе по следующему значению [duplicate]

Вероятно, это не причина вашей проблемы, но я заметил, что вы использовали optgroups в своем раскрывающемся списке, поэтому я решил, что это может помочь кому-то, если они завершатся здесь с этой проблемой. Для меня мне нужно было создать раскрывающийся список, который будет отображать с помощью optgroups, и я в конечном итоге использовал принятый ответ здесь , но пока он корректно отобразил элемент управления, он дал мне эту ошибку. Как я прошел, это подробно описано в моем ответе здесь .

66
задан Corone 4 February 2013 в 16:59
поделиться

7 ответов

С shift(), реализованным в v1.9.6 , это довольно просто.

DT[ , D := C + shift(B, 1L, type="lag")]
# or equivalently, in this case,
DT[ , D := C + shift(B)]

Из NEWS :

  1. Новая функция shift() реализует быстрый lead/lag из vector , list , data.frames или data.tables . Он принимает аргумент type, который может быть либо «lag» (по умолчанию), либо «lead» . Это позволяет очень удобно использовать вместе с := или set(). Например: DT[, (cols) := shift(.SD, 1L), by=id].

См. Историю предыдущих ответов.

82
ответ дан Arun 25 August 2018 в 19:36
поделиться

Вот мое интуитивное решение:

Ваш кадр данных

df = data.frame (A = 1: 5, B = seq (10,50,10), C = seq (100 500, 100))

Теперь создайте новый столбец

df $ D = c (NA, head (df $ B, 4) + tail (df $ C, 4))

Здесь 4 - количество строк минус 1. Если у вас есть, скажем, 1000 строк, то 4 следует заменить на 999. nrow (df) предоставляет вам количество строк в кадра данных или вектора. Аналогично, если вы хотите взять еще более ранние значения, вычтите из nrow 2, 3, ... и т. Д., А также поместите NA соответственно в начале. Надеюсь это поможет.

0
ответ дан Abdullah Adil Mahmud 25 August 2018 в 19:36
поделиться

Следуя решению Аруна, аналогичные результаты могут быть получены без ссылки на .N

> DT[, D := C + c(NA, head(B, -1))][]
   A  B   C   D
1: 1 10 100  NA
2: 2 20 200 210
3: 3 30 300 320
4: 4 40 400 430
5: 5 50 500 540
9
ответ дан Carl Witthoft 25 August 2018 в 19:36
поделиться

Несколько человек ответили на конкретный вопрос. См. Приведенный ниже код для функции общего назначения, которую я использую в таких ситуациях, которые могут быть полезны. Вместо того, чтобы просто получать предыдущую строку, вы можете пройти столько строк в «прошлом» или «будущем», сколько захотите.

rowShift <- function(x, shiftLen = 1L) {
  r <- (1L + shiftLen):(length(x) + shiftLen)
  r[r<1] <- NA
  return(x[r])
}

# Create column D by adding column C and the value from the previous row of column B:
DT[, D := C + rowShift(B,-1)]

# Get the Old Faithul eruption length from two events ago, and three events in the future:
as.data.table(faithful)[1:5,list(eruptLengthCurrent=eruptions,
                                 eruptLengthTwoPrior=rowShift(eruptions,-2), 
                                 eruptLengthThreeFuture=rowShift(eruptions,3))]
##   eruptLengthCurrent eruptLengthTwoPrior eruptLengthThreeFuture
##1:              3.600                  NA                  2.283
##2:              1.800                  NA                  4.533
##3:              3.333               3.600                     NA
##4:              2.283               1.800                     NA
##5:              4.533               3.333                     NA
19
ответ дан dnlbrky 25 August 2018 в 19:36
поделиться

На основании комментария @Steve Lianoglou выше, почему бы не просто:

DT[, D:= C + c(NA, B[.I - 1]) ]
#    A  B   C   D
# 1: 1 10 100  NA
# 2: 2 20 200 210
# 3: 3 30 300 320
# 4: 4 40 400 430
# 5: 5 50 500 540

И избегать использования seq_len или head или любой другой функции.

12
ответ дан Gary Weissman 25 August 2018 в 19:36
поделиться

Я добавил аргумент дополнения и изменил некоторые имена и назвал его shift. https://github.com/geneorama/geneorama/blob/master/R/shift.R

1
ответ дан geneorama 25 August 2018 в 19:36
поделиться

Используя dplyr, вы могли бы сделать:

mutate(DT, D = lag(B) + C)

Что дает:

#   A  B   C   D
#1: 1 10 100  NA
#2: 2 20 200 210
#3: 3 30 300 320
#4: 4 40 400 430
#5: 5 50 500 540
13
ответ дан Steven Beaupré 25 August 2018 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: