地理参照データのかなり大きなデータセットがあります。約4900万件のレコードです。data.table パッケージを使用して、それをサブセット化し (元は 1 億レコードでした)、各ユーザーの地理座標の平均中心などの簡単な計算を行うことができました。
ユニーク ユーザー数は 214,600 で、各ユニーク ユーザーについて、すべてのレコードのすべての地理座標からそれらの地理座標の平均中心までの距離を計算する必要があります (大円の公式を使用、サンプル コードを参照)。つまり、列 V6 と V7 (それぞれ経度と緯度) を使用して、大圏距離の計算を行う必要があります。V4 は userID で、V3 は userImageID です。V8 (16 の列) は座標の精度です。V5 は時間フィールドで、既に昇順で並べ替え (順序付け) ています。
私の問題は、すべてのユーザーに排他的に対応する座標に対してのみコードを反復処理することができず、最初のレコードが他の 4,800 万レコードなどを実行するため、メモリが不足してしまうことです。
大圏距離の計算に独自の式を使用しようとしましたが、パッケージ化石と地圏の式も使用しましたが、結果はありませんでした。
これは、多かれ少なかれ私のテーブルがどのように見えるかです (そして、私が使用している列のみを呼び出しています)。ここには、4 つのジオタグ付き画像を持つ最初のユーザーのデータが表示されます。
> subtest
V1 V2 V3 V4 V5 V6 V7 V8
1: 1 155229 9468411072 100004812@N06 2006-03-19 13:11:37.0 -2.224868 52.20397 16
2: 2 862398 9468409452 100004812@N06 2006-03-19 13:11:49.0 -2.224825 52.20399 16
3: 3 7931625 9465604241 100004812@N06 2006-03-19 15:12:23.0 -2.224890 52.20391 16
4: 4 7924096 9465627119 100004812@N06 2006-03-19 15:12:49.0 -2.224868 52.20397 16
そして私のコード:
library(data.table)
library(fossil)
library(geosphere)
setwd("E:/MassiveDatasets/LargeDataset")
yahoo2 <- fread("LD.csv", sep = ",", header = FALSE, colClasses="numeric")
a <-yahoo2
mlong <- a[, lapply(.SD, mean), by=V4, .SDcols = 6]
mlat <- a[, lapply(.SD, mean), by=V4, .SDcols = 7]
rad <- pi/180
b1 <- (mlat[,V7] * rad)
b2 <- (mlong[,V6] * rad)
Dist <- function(v) {
for (i in unique(a[, V3])) {
a1 <- a[, V7] * rad
a2 <- a[, V6] * rad
dlon <- b2 - a2
dlat <- b1 - a1
GC <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(GC), sqrt(1 - GC))
R <- 6371.0087714 # WGS84 mean radius
d <- R * c
return(d)
}
}
rgyr <- a[, lapply(.SD, Dist), by=V4]
ご回答ありがとうございます。