我有一个相当大的地理参考数据数据集。这是大约4900万条记录。使用data.table包我已经能够对它进行子集化(最初为1亿条记录)并进行一些简单的计算,例如每个用户的地理坐标的平均中心度数。
独特的用户是214,600,我需要为每个唯一用户计算距离(使用大圆公式,查看我的示例代码),从每个记录的每个地理坐标到这些地理坐标的平均中心。这意味着我需要使用V6和V7列(分别为经度和纬度)来进行大圆距离计算。 V4是userID,V3是userImageID,V8(具有16的列)是坐标的精度。 V5是时间字段,我已经按升序排序(顺序)。
我的问题是我无法使代码只针对专门对应每个用户的坐标进行迭代,而我最终会耗尽内存,因为第一条记录会运行其他4800万条记录,依此类推。
我曾尝试使用我自己的公式进行大圆距离计算,也尝试使用我自己的公式来计算化石和地球的包裹,没有结果。
这或多或少是我的表格的样子(我只调用我正在使用的列)。我们在这里看到第一个用户的数据,他有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]
非常感谢您的答案!