2017-10-11 16 views
0

私は2つのデータセット、AとBを持っている私は(両方が同じ列を有する)Bの各行はAの各行にどのくらい離れているかに興味が距離、

Bのサイズのために、AとBの積み重ねられたデータセットでdist()またはparDist()を計算し、サブセットをとることは実現不可能です。

より具体的には、Aが50000行、Bが250000とすると、250000行×50000列にこれらの距離を詳細に示します。

私が見落としている解決策はありますか?

+1

どのようなコードを試しましたか? – DiskJunky

+2

各エントリに8バイトがかかる場合、その結果は93.1GBになります。それを計算するのに必要なメモリをプラスします。 'R'では一般的にトリプルまたは280GBを意味します。一度にすべての距離を必要としないアルゴリズムは考えられませんか? –

+0

私は今までdistとpardistしか試していません。それは多くのRAMを使用しますが、計算時間は行ごとの計算よりも好ましいです。 – Dylan

答えて

0

これは、小さなデータセットと私のために働いたし、あなたのデータセットで動作するはずです。これは、タスクをチャンクに分け、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