2015-02-10 40 views
6

Tôi có hai bảng dữ liệu với toạ độ x, y và một số thông tin khác mà tôi muốn hợp nhất dựa trên khoảng cách lân cận gần nhất, tức là ở mức tối thiểu tính bình phương của cả x và y (. dx_i = min ([(x_i-x_j)^2 + (y_i-y_j)^2]^0.5) Giả sử tôi có hai bộ sau:Kết hợp dữ liệu với hai biến gần nhất

DT1=data.table(x=1:5,y=3:7)  
DT2=data.table(x=c(2,4,2,3,6),y=c(2.5,3.1,2,3,5),Q=c('a','b','c','d','e')) 

sau đó, kết quả mong muốn của việc hợp nhất sẽ là:

x y Q 
1: 1 3 a 
2: 2 4 d 
3: 3 5 d 
4: 4 6 e 
5: 5 7 e 

Tôi có thể viết một vòng qua DT1 để tính toán hàng xóm gần nhất cho mỗi hàng trong DT1 và sau đó hợp nhất dựa trên calcu này lation, nhưng điều đó dường như đánh bại mục đích của các bảng dữ liệu. Hơn nữa, điều đó sẽ rất chậm đối với các bảng dữ liệu của hàng triệu hàng.

Tôi biết rằng đối với một cột duy nhất tôi có thể làm một người hàng xóm gần sáp nhập như thế này

DT2[DT1,roll="nearest"] 

Nhưng đó (logic) không hoạt động khi tôi xác định 2 phím (x và y) cho các bảng để được sáp nhập. Có một cú pháp tương tự cho một sự kết hợp hàng xóm gần nhất có 2 tham số không? Nếu không, có cách nào thông minh hơn để thực hiện việc này không, chỉ cần lặp lại, như tôi đã đề cập?

+2

Lý do nó chỉ được thực hiện trong vòng 1 cột, là bởi vì đối với 1 cột bạn có thể sắp xếp nó trong cả hai bảng, làm cho nó dễ dàng để làm việc kết hợp với cán. Đối với 2 hoặc nhiều cột bạn không thể làm điều đó (không có thứ tự sắp xếp) và đó là một loại hoạt động hoàn toàn mới. – eddi

+0

@eddi Có, tôi hiểu rằng hoạt động sẽ thuộc một loại khác. Tôi đã tự hỏi liệu điều này (tôi nghĩ chung) loại hợp nhất đã được thực hiện một cách thông minh – Michiel

+0

Tôi đã không nghĩ quá nhiều về nó - nhưng nếu bạn nghĩ ra một thuật toán thông minh để làm điều đó, bạn chắc chắn có thể thêm gợi ý hoặc yêu cầu kéo trên github. – eddi

Trả lời

4

Một giải pháp khả thi:

func = function(u,v) 
{ 
    vec = with(DT2, (u-x)^2 + (v-y)^2) 
    DT2[which.min(vec),]$Q 
} 

transform(DT1, Q=apply(DT1, 1, function(u) func(u[1], u[2]))) 

# x y Q 
#1: 1 3 a 
#2: 2 4 d 
#3: 3 5 d 
#4: 4 6 e 
#5: 5 7 e 
Các vấn đề liên quan