2015-08-04 21 views
7

uyarınca R'de iki veri çerçevesine katılın. Merhaba İki tablom var (aşağıdaki tablo1 ve tablo2) ve bunların beklenen_sonrağı oluşturmak için en yakın zaman damgasını temel alarak bunları birleştirmek istiyorum. Dplyr içeren bir çeşit çözüm eğer mümkünse çok iyi olur, ama eğer bir şeyleri daha da karmaşıklaştırırsa olmaz.En yakın zaman damgası

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") 

cevap

12

haddeleme kullanma roll = "nearest" ile data.table özelliği katılır: Burada

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

, val2 sütun roll = "nearest" seçeneğiyle sütununda date üzerinde katılmak gerçekleştirerek oluşturulur. Her bir table1$date satırı için, table2$date arasındaki en yakın eşleşen satır hesaplanır ve karşılık gelen satır için val2 ayıklanır.

+0

Bu çok yararlı! "En yakın" dan "en son" a nasıl geçilir? Yani Zaman yönelimini koruyun ve gelecekte bir sıraya karışmayın. – emudrak

+1

@emudrak' roll = Inf' yönlü sınırsız. sivriltmek için roll = 30 'yön limiti. Yönü kontrol etmek için işaret kullanın. –

2

Bu yavaş yükümlü olduğu, ama ...

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 

idx inşa etmenin bir başka yolu max.col(-outer(table1$date, table2$date, d)) olduğunu.