Использование R data.table для расчета большого расстояния по кругу для большого набора данных

У меня довольно большой набор данных с географической привязкой. Это около 49 миллионов записей. Используя пакет data.table, я смог установить его подмножество (изначально было 100 миллионов записей) и сделать несколько простых вычислений, например, средний центр для географических координат в градусах для каждого пользователя.

Количество уникальных пользователей составляет 214 600, и мне нужно рассчитать расстояние (используя формулу большого круга, ПОСМОТРИ мой пример кода) для каждого уникального пользователя от каждой географической координаты для каждой записи до среднего центра этих географических координат. Это означает, что мне нужно использовать столбцы V6 и V7 (долгота и широта соответственно) для вычисления расстояния по большому кругу. V4 - это идентификатор пользователя, а V3 - это идентификатор пользователя, V8 (столбец с 16) - это точность координат. V5 - это поле времени, которое я уже отсортировал (по порядку) в порядке возрастания.

Моя проблема в том, что я не могу заставить код повторяться только для координат, которые соответствуют исключительно каждому пользователю, и у меня заканчивается память, потому что первая запись проходит через остальные 48 миллионов записей и так далее.

Я попытался использовать мою собственную формулу для расчета расстояния большого круга, а также формы из пакетов ископаемых и геосферы, но безрезультатно.

Примерно так выглядит моя таблица (и я называю только те столбцы, которые использую). Здесь мы видим данные для первого пользователя, у которого есть 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 ответов

Другие вопросы по тегам