Повторная синхронизация таблицы data.table в длинном формате - PullRequest
1 голос
/ 07 августа 2020

Мне нужно пересчитать следующую таблицу 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.

Спасибо!

1 Ответ

3 голосов
/ 07 августа 2020

Вот вариант:

x[CJ(id, date=y$date, unique=TRUE), on=.NATURAL]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...