Подтвердить что ты не робот

Слияние данных по нескольким столбцам

Я новичок в программировании, а также в data.table в R - так что, возможно, этот вопрос очень прост, но я искал и не мог найти никаких решений.

Я пытаюсь совместить 4 переменные попарно и добавить столбец со значением поиска. В базе я бы сделал merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro")), где df1 имеет 9 столбцов, а df2 (2 - lsr и pro). Df2 имеет только 3, li, pro и "значение", которое меня интересует, alpha.

Это прекрасно работает, но поскольку я начинаю быть огромным поклонником data.table, я хотел бы сделать это в методе data.table - и потому, что у меня есть миллионы строк - поэтому слияние базы происходит медленно (я видел, что функция by.x и by.y находится в ожидании для data.table, но, возможно, есть обходной путь). См. Некоторые примеры данных ниже:

df2:
         alpha         li        pro
      1: 0.5000000 0.01666667 0.01666667
      2: 0.3295455 0.03333333 0.01666667
      3: 0.2435897 0.05000000 0.01666667
      4: 0.1917808 0.06666667 0.01666667
      5: 0.1571429 0.08333333 0.01666667
df1:     
          demand rtime    mcv         mck        ppr       mlv         mlk        lsr
      1:    0.3     1 357.57700 0.099326944 0.01666667 558.27267 0.155075741 0.01666667
      2:    0.3    10 548.75433 0.152431759 0.01666667 614.30667 0.170640741 0.03333333
      3:    0.3    11 314.55767 0.087377130 0.01666667 636.48100 0.176800278 0.03333333
      4:    0.3     2 312.15033 0.086708426 0.01666667 677.48100 0.188189167 0.06666667
      5:    0.3     3 454.47867 0.126244074 0.01666667 608.92067 0.169144630 0.01666667
     ---                                                                               
6899196:    0.6     5 537.92673 0.149424093 1.00000000 537.92673 0.149424093 1.00000000
6899197:    0.6     6 277.34732 0.077040923 1.00000000 277.34732 0.077040923 1.00000000
6899198:    0.6     7  73.31484 0.020365235 1.00000000  73.31484 0.020365235 1.00000000
6899199:    0.6     8  32.04197 0.008900546 1.00000000  32.04197 0.008900546 1.00000000
6899200:    0.6     9  14.59008 0.004052799 1.00000000  14.59008 0.004052799 1.00000000

последним, может быть, интересно, что в df2 у меня есть уникальные строки, а в df1 у меня много дубликатов в отношении lsr и ppr. Я также попытался установить два ключа и присоединиться к ним методом data.table и добавить новый столбец с альфой. Но безуспешно. Спасибо вам за вашу помощь!

4b9b3361

Ответ 1

Вы можете использовать выражение Дэвида Аренбурга в комментарии:

setkey(df1, lsr, ppr)
setkey(df2, li, pro)
df1[df2, alpha := i.alpha]

Из текущей версии версии 1.9.5 мы можем напрямую выполнять соединения без необходимости устанавливать ключи с помощью аргумента on:

df1[df2, alpha := i.alpha, on = c(lsr="li", ppr="pro")]

Если вы не хотите устанавливать версию devel, вы можете дождаться, пока это будет нажато как v1.9.6 на CRAN.