使用R data.table计算大型数据集的大圆距离

时间:2014-11-21 22:46:06

标签: r function data.table great-circle large-data

我有一个相当大的地理参考数据数据集。这是大约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]

非常感谢您的答案!

0 个答案:

没有答案