2015-08-04 41 views
7

Xin chào Tôi có hai bảng (table1 và table2 bên dưới) và muốn tham gia chúng dựa trên dấu thời gian gần nhất để tạo expect_output. Một số loại giải pháp liên quan đến dplyr sẽ là tuyệt vời nếu có thể, nhưng không phải nếu nó tiếp tục làm phức tạp mọi thứ.Tham gia hai khung dữ liệu trong R dựa trên dấu thời gian gần nhất

table1 = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200 
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L, 
33L, 53L)), .Names = c("date", "val1"), row.names = c(NA, -3L 
), class = "data.frame") 

table2 = 
structure(list(date = structure(c(1430248288, 1435690482, 1434050843 
), class = c("POSIXct", "POSIXt"), tzone = ""), val2 = c(67L, 
90L, 18L)), .Names = c("date", "val2"), row.names = c(NA, -3L 
), class = "data.frame") 

expected_output = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200 
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L, 
33L, 53L), val2 = c(90L, 18L, 67L)), .Names = c("date", "val1", 
"val2"), row.names = c(NA, -3L), class = "data.frame") 

Trả lời

12

Sử dụng cán tham gia tính năng của data.table với roll = "nearest":

require(data.table) # v1.9.6+ 
setDT(table1)[, val2 := setDT(table2)[table1, val2, on = "date", roll = "nearest"]] 

Ở đây, val2 cột được tạo ra bằng cách thực hiện một tham gia trên cột date với roll = "nearest" tùy chọn. Đối với mỗi hàng của table1$date, hàng phù hợp gần nhất từ ​​table2$date được tính và val2 cho hàng tương ứng được trích xuất.

+0

Điều này rất hữu ích! Bất kỳ ý tưởng làm thế nào để thay đổi từ "gần nhất" để "gần đây nhất?" I E. giữ thời gian định hướng, và không hợp nhất với một hàng trong tương lai? – emudrak

+1

@emudrak 'roll = Inf' hướng không giới hạn. 'roll = 30' giới hạn định hướng đối với độ cứng. Sử dụng ký hiệu để điều khiển hướng. –

2

này phải chịu trách nhiệm là chậm, nhưng ...

d <- function(x,y) abs(x-y) # define the distance function 
idx <- sapply(table1$date, function(x) which.min(d(x,table2$date))) # find matches 

cbind(table1,table2[idx,-1,drop=FALSE]) 
#     date val1 val2 
# 2 2015-07-16 08:55:00 94 90 
# 3 2015-06-20 00:15:00 33 18 
# 1 2015-05-12 15:00:00 53 67 

Một cách khác để xây dựng idxmax.col(-outer(table1$date, table2$date, d)).

Các vấn đề liên quan