Объединение в таблицах данных (Предупреждающее сообщение: в `[.data.table`(dt[dt2 вкл . = .(common_key), : элемент 1 результата j для группы 8 имеет нулевую длину)

#r #data.table

#r #data.table

Вопрос:

У меня есть две таблицы данных —

  1) dt
       id       week       group 
    1: QQQ 2012-01-16    A
    2: QQW 2012-01-16    A
    3: QQW 2012-01-16    B
    4: QQD 2012-01-16    A
    5: ASE 2012-01-16    D
   ---                                           
 99999: RLN 2012-01-30    C
100000: PLF 2012-01-23    E
100001: PNI 2012-01-23    A
100002: RLF 2012-01-23    A
100003: PEV 2012-02-06    A

2) dt2

          id    other_id yet_another_id week_group     attribute  other_attribute yet_another_attribute   attribute_again
     1:  QQQ     KFG     234           2012-01-09     2012-01-09        there           this         (Missing)
     2:  QQW     FKI     534           2012-01-09     2012-01-16        there           this         (Missing)
     3:  QEW     LRN     231           2012-01-09     2012-01-23        there           this         (Missing)
     4:  SAE     UNJ     123           2012-01-09     2012-01-30         here           this         (Missing)
     5:  DWT     KJY     123           2012-01-09     2012-02-06         here           that         (Missing)
    ---                                                                                                                
682910:  SEC     URM     123           2012-01-23     2012-04-02        here            this         (Missing)
682911:  FTW     JUP     234           2014-07-14     2014-07-14        there           this            Burger
682912:  DTW     KJY     456           2012-01-23     2012-01-23        there           that         (Missing)
682913:  SET     FKG     565           2012-01-23     2012-01-23        there           that         (Missing)
682914:  QQQ     JKY     534           2012-01-23     2012-01-23        there           that         (Missing)
           attr_4   attr_5     attr_6  attr_7 attr_8 
     1: (Missing) (Missing) (Missing) starr      Over                   
     2: (Missing) (Missing) (Missing) starr      Over                   
     3: (Missing) (Missing) (Missing) starr      Over                   
     4: (Missing) (Missing) (Missing) starr      Under                   
     5: (Missing) (Missing) (Missing) starr      Under                  
    ---                                                                                   
682910: (Missing) (Missing) (Missing) starr      Over                   
682911:      King    Sponge    Square starr      Over                   
682912: (Missing) (Missing) (Missing) starr      Over                   
682913: (Missing) (Missing) (Missing) bob      Over                   
682914: (Missing) (Missing) (Missing) bob      Over                   
  

Уникальным ключом в первой таблице данных является идентификатор Неделя (например, каждая комбинация идентификатора и недели принадлежит только одной группе).). Во втором фрейме данных заданный идентификатор другой идентификатор пара yet_another_id может иметь несколько значений для каждого из атрибутов.

В первой таблице данных каждый идентификатор имеет значения только для некоторых недель. Во второй таблице данных каждый идентификатор имеет значения для еще многих недель (хотя и не для всех недель). Данный идентификатор всегда будет иметь больше значений для недель во второй таблице данных, чем в первой.

Я пытаюсь объединить таблицы с помощью этой команды

       dt[dt2, on = .(id), 
                     allow.cartesian = TRUE][
                       , .(group = group[which.min(abs(i.week - week))],
                           id, other_id, yet_another_id,
                           week_group, 
                           attribute, other_attribute, yet_another_attribute,
                           attribute_again,
                           attr_4, attr_5, attr_6, attr_7, attr_8), 
                       .(id, i.week)][, .(week = i.week,
                                                 id, other_id, yet_another_id,
                           week_group, 
                           attribute, other_attribute, yet_another_attribute,
                           attribute_again,
                           attr_4, attr_5, attr_6, attr_7, attr_8)] %>%
             unique(.)
  

Я хотел бы объединить идентификатор в dt с идентификатором в dt2 , где ближайшая неделя либо равна неделе в dt2 , либо самой ранней неделе перед этой неделей. Затем я выбираю все столбцы и удаляю дубликаты.

Но, я думаю, у меня проблема с объединением, потому что я получаю эту ошибку:

Предупреждающее сообщение: В [.data.table (dt[dt2 вкл = .(id), : Элемент 1 результата j для группы 8 имеет нулевую длину. Это будет заполнено 2 NAS, чтобы соответствовать самому длинному столбцу в этом результате. У более поздних групп может возникнуть аналогичная проблема, но сообщается, что только первая сохраняет заполнение буфера предупреждения.

Комментарии:

1. пожалуйста, предоставьте некоторые примеры данных, которые воспроизводят вашу проблему, используя dput()

2. the R inferno, paragraph 9.8 : Минимальный, автономный пример позволяет читателям легко воспроизвести проблему. Чем проще вы сделаете это для своих читателей, тем больше вероятность, что вы получите помощь. […] Недостаточно подчеркнуть, что сообщение отдает себя на милость незнакомцев. Если у кого-то хватит ума и знаний ответить на ваш вопрос, у него, вероятно, есть другие вещи, которые он хотел бы сделать. Сделав ваше сообщение ясным, кратким и удобным для пользователя, вы можете надеяться, что хотя бы один из этих незнакомцев отвлечет свое внимание от своей жизни к вашей проблеме.

3. Читая документ ?which.min , вы можете видеть, что он может возвращать результат с длиной 0, объясняющий ваше предупреждение о «нулевой длине». Пример: group = 1:3; w = which.min(NA); group[w] . Вероятно, после объединения (а может быть, даже раньше?) У вас есть неделя или i.week с отсутствующими значениями, поэтому между ними нет минимального расстояния.

4. Это имеет смысл. Ожидаете ли вы, что код будет выполняться так, как ожидалось, при нулевой длине? Мне интересно, присоединится ли это к обеим неделям. Я могу протестировать это в своей системе

5. просто сделайте свой вопрос воспроизводимым с помощью copy-paste, и вы получите голоса и полезные ответы

Ответ №1:

Некоторые id s находятся в dt2 , которых нет в dt .

Попробуйте dt2[!dt, on = 'id'] посмотреть, какие из них.

Вы также можете просто добавить nomatch = 0 к первоначальному объединению, чтобы отменить их. Т.е.

 dt[dt2, on = .(id), allow.cartesian = TRUE, nomatch = 0]
  

Я понятия не имею, делает ли остальная часть кода то, что вы хотите. Не без воспроизводимого примера.