2015-05-21 3 views
10

Я новичок в программировании, а также в 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, но, возможно, есть обходной путь). Смотрите некоторые примеры данных ниже:data.table merge by multiple columns

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 и ППР. Я также попытался установить два ключа и присоединиться к ним методом data.table и добавить новый столбец с альфой. Но безуспешно. Спасибо за твою помощь!

+0

Если вам не нужно внешнее соединение, вы можете просто сделать левое, правое соединение или внутреннее соединение, используя двоичное соединение. Вопрос в том, какой из них вы хотите. Хотя, судя по вашему базовому R-коду, кажется, что вы заработали внутреннее соединение? Кроме того, какую колонку вы хотите сохранить? У вас также нет столбца 'pro' в' df1' –

+0

Спасибо. На самом деле, я полагаю, в этом случае внутреннее и левое соединения одинаковы, так как все комбинации lsr и ppr, или li и pro включены как в df1, так и в df2. И не имея про в df1, это опечатка! Извините за это, я имел в виду, ppr в df1, я отредактирую и исправлю это. Я хотел бы сохранить все столбцы из df1 и добавить альфу в качестве нового столбца. –

+0

Если вам нужно левое соединение с 'df1' при обновлении столбца' alpha', это простое двоичное соединение. Попробуйте 'setkey (df1, lsr, ppr); setkey (df2, li, pro); df1 [df2, alpha: = i.alpha]; df1' –

ответ

11

Вы можете использовать оператор, представленный Дэвид Arenburg в комментарии:

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

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

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

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