объединение двух таблиц data.table с дубликатами в столбце, используемом для объединения - PullRequest
0 голосов
/ 12 октября 2018

У меня есть вопрос о слиянии двух data.tables.До сих пор я не мог найти никакого решения здесь на стеке потока или где-либо еще.Поэтому здесь вопрос:

Задача: я хочу объединить две таблицы данных на основе столбца даты (date_dawn).Как видите, в таблице A есть повторяющиеся даты, поскольку я получаю даты из нескольких временных отметок в течение одного дня (ts.x).Таблица B имеет одну дату в день (date_dawn) и несколько столбцов, которые мне нужно прикрепить к таблице A.

Сообщение об ошибке, которое я получаю при использовании слияния:

Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__,  : 
Join results in 1469574 rows; more than 588399 = nrow(x)+nrow(i). Check for 
duplicate key values in i each of which join to the same group in x over and 
over again. If that's ok, try by=.EACHI to run j for each group to avoid the 
large allocation. If you are sure you wish to proceed, rerun with 
allow.cartesian=TRUE. Otherwise, please search for this error message in the 
FAQ, Wiki, Stack Overflow and data.table issue tracker for advice.

Пример таблицы A

 date_dawn         ts.x                  ....
 1: 2015-09-22     2015-09-22 15:15:00
 2: 2015-09-22     2015-09-22 15:20:00
 3: 2015-09-23     2015-09-23 15:25:00
 4: 2015-09-23     2015-09-23 15:30:00
 5: 2015-09-23     2015-09-23 15:35:00
 6: 2015-09-24     2015-09-24 15:40:00

Пример таблицы B

  date_dawn       ts_ss                 ....
  1: 2015-09-22   2015-09-22 16:58:26
  2: 2015-09-23   2015-09-23 16:56:09
  3: 2015-09-24   2015-09-24 16:53:51
  4: 2015-09-25   2015-09-25 16:51:33
  5: 2015-09-26   2015-09-26 16:49:16
  6: 2015-09-27   2015-09-27 16:46:59

Желаемый результат будет:

   date_dawn         ts.x                  ts_ss                 ....
   1: 2015-09-22     2015-09-22 15:15:00    2015-09-22 16:58:26
   2: 2015-09-22     2015-09-22 15:20:00    2015-09-22 16:58:26
   3: 2015-09-23     2015-09-23 15:25:00    2015-09-23 16:56:09
   4: 2015-09-23     2015-09-23 15:30:00    2015-09-23 16:56:09
   5: 2015-09-23     2015-09-23 15:35:00    2015-09-23 16:56:09
   6: 2015-09-24     2015-09-24 15:40:00    2015-09-24 16:53:51

Проблема до сих пор заключалась в том, что любое другое «решение» (как вфункция left_join, или при использовании allow.cartesian = T в функции слияния, как предполагалось в приведенном выше сообщении об ошибке), использовала все виды комбинаций совпадений между x и y.Но я хочу, чтобы только строки таблицы B с определенным date_dawn записывались в строки таблицы A с соответствующим date_dawn.

Спасибо за любые предложения

РЕШЕНИЕ:

Проблема была в том, что я получил дубликаты в обеих таблицах.Поэтому мне пришлось либо объединить на основе нескольких столбцов, либо убедиться, что в одной из таблиц нет дубликатов.Таким образом, было возможно объединиться, не получив все возможные комбинации между дубликатами в Таблице A и B. Извините, если я вызвал путаницу, и спасибо сообществу за поддержку.

1 Ответ

0 голосов
/ 12 октября 2018

Я не уверен, что понимаю проблему, вы можете легко присоединиться к двум, то есть: с dplyr ниже

df1 <- data.frame(
    x = rep(c("x", "y"), 5),
    a = sample(1:5, 10, replace = T)
)

df2 <- data.frame(
    x = c("x", "y"),
    b = LETTERS[1:2]
)

library(dplyr)

left_join(df1, df2, by = "x")

РЕДАКТИРОВАТЬ

На основев вашем комментарии вы можете просто использовать inner_join, вы можете прочитать документ всего ?dplyr::join.

library(dplyr)

# with duplicates
df1 <- data.frame(
  date_dawn = sample(
    seq.Date(Sys.Date() - 2, Sys.Date(), by  = "day"), 
    10, 
    replace = TRUE
  ),
  ts.x = seq.Date(Sys.Date() - 9, Sys.Date(), by  = "day")
)

df2 <- data.frame(
  date_dawn = seq.Date(Sys.Date() - 2, Sys.Date(), by  = "day"),
  ts_ss = seq.Date(Sys.Date() - 100, Sys.Date() - 98, by = "day")
)

# merge
inner_join(df1, df2, by = "date_dawn")
...