2015-05-21 11 views
10

Tôi khá mới lập trình và cũng có thể là data.table trong R - vì vậy có lẽ câu hỏi này thực sự đơn giản, nhưng tôi đã tìm kiếm và không thể tìm thấy bất kỳ giải pháp nào.

Tôi đang cố gắng kết hợp 4 biến theo cặp và thêm một cột với giá trị tra cứu. Trong cơ sở, tôi sẽ làm merge(df1,df2, by.x=c("lsr","ppr"),by.y=c("li","pro")), trong đó df1 có 9 cols và df2 (2 là lsr và pro) df2 chỉ có 3, li, pro và "giá trị" mà tôi quan tâm, alpha.

Điều này làm việc tốt, nhưng khi tôi bắt đầu là một fan hâm mộ lớn của data.table, tôi muốn làm điều này theo cách data.table - và bởi vì tôi có một số hàng triệu hàng - vì vậy cơ sở hợp nhất là chậm (tôi thấy , rằng tính năng by.x và by.y đang chờ xử lý dữ liệu. nhưng có thể có giải pháp thay thế). Xem một số dữ liệu mẫu dưới đây: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 

cuối cùng, có lẽ quan tâm là, rằng trong df2 Tôi có hàng độc đáo, và trong df1, tôi có rất nhiều các bản sao ở đối với LSR và ppr. Tôi cũng đã cố gắng thiết lập hai khóa và tham gia chúng theo cách data.table, và thêm một cột mới với alpha. Nhưng không thành công. Cảm ơn bạn cho tất cả sự giúp đỡ của bạn!

+0

Nếu bạn không cần tham gia bên ngoài, bạn chỉ có thể làm một trái, phải tham gia hoặc tham gia bên trong bằng cách sử dụng tham gia nhị phân. Câu hỏi là cái bạn muốn. Mặc dù đánh giá bởi mã R cơ bản của bạn, nó có vẻ như bạn wan một tham gia bên trong? Ngoài ra, bạn muốn giữ cột nào? Bạn cũng không có cột 'pro' trong' df1' –

+0

Cảm ơn. Thực ra tôi tin rằng, trong trường hợp này, các kết nối bên trong và bên trái là như nhau, vì tất cả các kết hợp của lsr và ppr, hoặc của li và pro đều được bao gồm trong cả df1 và df2. Và không có chuyên nghiệp trong df1 là một lỗi đánh máy !! Xin lỗi cho điều đó, tôi có nghĩa là, ppr trong df1, tôi sẽ chỉnh sửa và sửa nó. Tôi muốn giữ tất cả các cột từ df1 và thêm alpha làm cột mới –

+0

Nếu tất cả những gì bạn cần là tham gia trái với 'df1' trong khi cập nhật cột' alpha', nó là một phép nối nhị phân đơn giản. Hãy thử 'setkey (df1, lsr, ppr); setkey (df2, li, pro); df1 [df2, alpha: = i.alpha]; df1' –

Trả lời

11

Bạn có thể sử dụng câu lệnh được cung cấp bởi David Arenburg trong bình luận:

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

Từ current devel version, 1.9.5, chúng tôi có thể thực hiện tham gia trực tiếp mà không cần phải thiết lập các phím sử dụng lập luận on:

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

Nếu bạn không muốn cài đặt phiên bản devel, sau đó bạn có thể đợi cho đến khi điều này được đẩy như v1.9.6 trên CRAN.