2017-10-11 58 views
0

我有兩個數據集,A和B在數據集B中的行之間的距離,基於數據集

我感興趣的B的每一行多遠是A中的每個行(都具有相同的列) 。

由於B的大小,在A和B的堆疊數據集上計算dist()或parDist()並採用子集是不可行的。

更具體地說:假設A是50000行,B是250000.我想要250000行x 50000列來詳細說明這些距離。

我忽略的任何解決方案?

+1

你試過了什麼代碼? – DiskJunky

+2

如果每個條目佔用8個字節,那麼結果將佔用93.1GB。加上計算所需的內存。在'R'通常意味着在三倍或280GB左右。你不能想到一次不需要所有距離的算法嗎? –

+0

我只嘗試過dist和pardist到目前爲止。它使用了大量的RAM,但計算時間優於逐行計算。 – Dylan

回答

0

這適用於我一個較小的數據集,應該在你的數據集上工作。它將任務分成塊,並計算每行A的彙總統計數據與B的所有行的彙總統計數據。它最終仍然執行全部比較,因爲它遍歷A的所有行。

set.seed(1) 
A <- as.data.frame(matrix(runif(500*2)*10, nrow=500)) # change 500 to 50000 
B <- as.data.frame(matrix(runif(250000*2)*10, nrow=250000)) 

myfun <- function(rowsofA, B) { 
    Dx <- outer(rowsofA[,1], B[,1], "-")**2 # ** is same as^
    Dy <- outer(rowsofA[,2], B[,2], "-")**2 
    Dist <- sqrt(Dx+Dy) # Dist = sqrt((x1-x2)^2 + (y1-y2)^2) 
    # add summary stat below 
    Summ <- data.frame(mean = apply(Dist, 1, mean), 
       sd = apply(Dist, 1, sd), 
       min = apply(Dist, 1, min), 
       max = apply(Dist, 1, max)) 
    return(Summ) 
} 

library(purrr) 
map_df(split(A, 1:5), ~myfun(.x, B)) 

隨着500行數據集中,split(..., 1:5)將數據幀分成5 100(如果這不是你要找的內容,它提供了一個可重複的例子和預期產出,以避免這樣的情況是很重要的) - 行數據幀。對於50,000行數據集,根據您的內存使用類似split(..., 1:100)split(..., 1:1000)

輸出500行數據集。輸出的每一行都爲A的每一行與B的所有行提供了mean, sd, min, and max距離。

 # mean  sd   min  max 
# 1 4.332120 1.922412 0.0104518694 9.179429 
# 2 6.841677 2.798114 0.0044511643 13.195127 
# 3 5.708658 2.601969 0.0131417242 11.788345 
# 4 4.670345 2.139370 0.0104878996 9.521932 
# 5 6.249670 2.716091 0.0069813098 12.473525 
# 6 5.497154 2.476391 0.0127143548 11.108188 
# 7 3.928659 1.551248 0.0077266976 7.954166 
# etc 
相關問題