簡體   English   中英

ffbase:在X和Y列以及最接近的Z列上合並

[英]ffbase: merge on columns X and Y and closest column Z

我想使用ffdf完成以下操作:在X和Y列上合並,然后在最接近的Time上合並,然后在closes列B上合並。但是, 在較小的示例中 ,我知道的過程涉及使用外部合並(如下所示)。 使用ffbase,對於無法容納在內存中(並且可能不適用於sqldf)的大型示例,該如何解決? 如果不可能的話,最好的圖書館是什么?

作為可重現的示例,如下所示:

set.seed(1)
df.ff <- as.ffdf(cbind(expand.grid(x = 1:3, y = 1:5), time = round(runif(15) * 30)))

to.merge.ff <- as.ffdf(data.frame(x = c(2, 2, 2, 3, 2), y = c(1, 1, 1, 5, 4), time = c(17, 12, 11.6, 22.5, 2), val = letters[1:5], stringsAsFactors = F))

我從@ChinmayPatil借用以下示例,以突出顯示我要遵循的類似過程:( R-在匹配的A,B和* close * C?上合並數據幀 ):

require(data.table)
set.seed(1)
df <- setDT(cbind(expand.grid(x = 1:3, y = 1:5), time = round(runif(15) * 30)))

to.merge <- setDT(data.frame(x = c(2, 2, 2, 3, 2), y = c(1, 1, 1, 5, 4), time = c(17, 12, 11.6, 22.5, 2), val = letters[1:5], stringsAsFactors = F))

## First do a left outer merge
A <- merge(to.merge,df, by = c('x','y'), all.x = T )

## Then calculate a diff row as such
A$diff <- abs(A$time.x - A$time.y)

##then take the minimum distance
A[ , .I[which.min(diff)] , by = c('x', 'y' ) ]

鑒於我的問題很少見且沒有答案,我將描述我想出的解決此問題的方法,希望有人會發現它有用(甚至對我來說,以供日后參考):

對我來說,在一列上執行此匹配,然后在另一列上執行最接近的匹配,最困難的方面是我一直認為進行外部聯接(如后所述)是必要的。 使用data.table和ffdfdply解決方案非常簡單。 出於說明目的,假定有一個適合內存的大型ffdf對象和一個常規data.table

### Large ffdf object    
A <- as.ffdf(data.table( dates.A = seq.Date(as.Date('2008-01-01'),as.Date('2008-01-31'), by = '3 days'), 
                     letters.A = LETTERS[1:4] , value.A = runif(4) ))

### Small data.table that fits in memory
B <- data.table( date.B = seq.Date(as.Date('2008-01-01'),as.Date('2008-01-05'), by = 'days'), 
                 letters.B = LETTERS[1:4] , value.B = runif(4) )

然后,您可以簡單地定義一個使用data.table和roll ='nearest'進行合並的函數:

merge.ff <- function(x){
setDT(x)
x[, ':=' (dates.merge = dates.A, letters.merge = letters.A)]
B[, ':=' (dates.merge = date.B, letters.merge = letters.B)]
setkeyv(x, c('letters.merge','dates.merge'))
setkeyv(B, c('letters.merge','dates.merge'))

as.data.frame(B[x, roll = 'nearest'])
}

並將其應用於A:

result <- ffdfdply( A, split = A$dates.A, FUN = merge.ff)

該鍵實際上只是在data.table中使用roll方法並將其傳遞給ffdfdply。 看來效率很高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM