0
我有兩個數據集,A和B在數據集B中的行之間的距離,基於數據集
我感興趣的B的每一行多遠是A中的每個行(都具有相同的列) 。
由於B的大小,在A和B的堆疊數據集上計算dist()或parDist()並採用子集是不可行的。
更具體地說:假設A是50000行,B是250000.我想要250000行x 50000列來詳細說明這些距離。
我忽略的任何解決方案?
我有兩個數據集,A和B在數據集B中的行之間的距離,基於數據集
我感興趣的B的每一行多遠是A中的每個行(都具有相同的列) 。
由於B的大小,在A和B的堆疊數據集上計算dist()或parDist()並採用子集是不可行的。
更具體地說:假設A是50000行,B是250000.我想要250000行x 50000列來詳細說明這些距離。
我忽略的任何解決方案?
這適用於我一個較小的數據集,應該在你的數據集上工作。它將任務分成塊,並計算每行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
你試過了什麼代碼? – DiskJunky
如果每個條目佔用8個字節,那麼結果將佔用93.1GB。加上計算所需的內存。在'R'通常意味着在三倍或280GB左右。你不能想到一次不需要所有距離的算法嗎? –
我只嘗試過dist和pardist到目前爲止。它使用了大量的RAM,但計算時間優於逐行計算。 – Dylan