我有一个相当大的地理参考数据集。大约有 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]
非常感谢您的回答!