Мне нужно пересчитать следующую таблицу x, учитывая даты в таблице y, но я хотел бы сохранить даты, которые не совпадают для каждого идентификатора в таблице. Легче объяснить на этом простом примере (я использую библиотеки data.table и lubridate):
x <- data.table(id = c("A","A","A","B","B"), date = dmy(c("01-01-2010","01-01-2012","01-01-2014","01-01-2010","01-01-2012")),
v1 =1:5)
x
id date v1
1: A 2010-01-01 1
2: A 2012-01-01 2
3: A 2014-01-01 3
4: B 2010-01-01 4
5: B 2012-01-01 5
y <- data.table(date = dmy(c("01-01-2010","01-01-2013")) )
y
date
1: 2010-01-01
2: 2013-01-01
Это результат, который мне нужен:
id date v1
1: A 2010-01-01 1
2: A 2013-01-01 NA
3: B 2010-01-01 4
4: B 2013-01-01 NA
Одно решение, которое я нашел, что легко для этого небольшого примера, состоит в том, чтобы создать версию b "длинного формата", которая включает следующие идентификаторы:
y <- data.table(id = c("A","A","B","B"), date = dmy(c("01-01-2010","01-01-2013","01-01-2010","01-01-2013")) )
y
id date
1: A 2010-01-01
2: A 2013-01-01
3: B 2010-01-01
4: B 2013-01-01
Затем установите два ключа
setkey(x,id,date)
setkey(y,id,date)
Затем, наконец, выполните правое соединение
x[y]
Это дает мне результат, который я хочу в этом простом небольшом примере. Однако в моем реальном случае моя таблица x имеет много миллионов строк (это данные с периодичностью в одну минуту), тогда как таблица y (даты повторной выборки) - всего несколько сотен строк. Я предполагаю, что для создания нового y, который также имеет длину в миллионы строк, слишком много памяти, чтобы добиться цели. В качестве альтернативы я подумал, что могу сделать для l oop и разделить таблицу данных на куски в соответствии с идентификатором на каждом l oop, а затем выполнить правильное соединение на исходном y (но установив только один ключ). Однако я бы хотел избежать l oop.
Спасибо!