2015-05-21 26 views
10

Jestem całkiem nowy w programowaniu, a także w data.table w R - więc może to pytanie jest naprawdę proste, ale szukałem i nie mogłem znaleźć żadnych rozwiązań.

Próbuję dopasować 4 zmienne parami i dodać kolumnę z wartością odnośnika. W bazie, zrobiłbym merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro")), gdzie df1 ma 9 coli, a df2 (2 to lsr i pro) df2 ma tylko 3, li, pro i "wartość", którą mnie interesują, alfa.

To działa dobrze, ale jak zaczynam być wielkim fanem data.table, chciałbym to zrobić w sposób data.table - i ponieważ mam kilka milionów wierszy - więc podstawowa fuzja jest powolna (widziałem , że funkcje by.x i by.y oczekują na data.table, ale być może istnieje obejście tego problemu). Zobacz kilka przykładowych danych poniżej:data.table scalanie przez wiele kolumn

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 

ostatni, być może w okolicy jest, że w df2 mam unikatowe wiersze, aw DF1, mam wiele duplikatów w odniesieniu do LSR i PPR. Próbowałem również ustawić dwa klucze i połączyć je z metodą data.table, dodając nową kolumnę z alfą. Ale bez powodzenia. Dziękuję Ci za całą twoją pomoc!

+0

Jeśli nie potrzebujesz sprzężenia zewnętrznego, możesz po prostu zrobić lewe, prawe połączenie lub wewnętrzne połączenie przy użyciu łączenia binarnego. Pytanie, które z nich chcesz. Chociaż sądząc po twoim podstawowym kodzie R, wydaje ci się, że jesteś bliski wewnętrznemu złączeniu? A także, którą kolumnę chcesz zachować? Nie masz również kolumny 'pro' w' df1' –

+0

Dzięki. Właściwie uważam, że w tym przypadku wewnętrzne i lewe łączenia są takie same, ponieważ wszystkie kombinacje lsr i ppr, lub li i pro są zawarte zarówno w df1 jak i df2. A brak pro w df1 to literówka !! Przepraszam za to, miałem na myśli, ppr w df1, będę edytować i poprawiać. Chciałbym zachować wszystkie kolumny z df1 i dodać alfa jako nową kolumnę –

+0

Jeśli wszystko czego potrzebujesz to lewe dołączenie do 'df1' podczas aktualizacji kolumny' alpha', jest to proste sprzężenie binarne. Spróbuj 'setkey (df1, lsr, ppr); setkey (df2, li, pro); df1 [df2, alpha: = i.alpha]; df1' –

Odpowiedz

11

Można użyć instrukcji dostarczonych przez Davida Arenburg w komentarzu:

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

Z current devel version, 1.9.5 możemy wykonać przyłącza się bezpośrednio, bez konieczności ustawiania klawiszy za pomocą on argumentu:

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

Jeśli nie chcesz instalować wersji devel, możesz poczekać, aż zostanie ona wciśnięta jako wersja 1.0.6 na CRAN.