R вычисляет расстояние на основе долготы и широты из двух кадров данных

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

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

Первый кадр данных - это topo.rams в приведенном ниже коде, а второй - topo.msg. Конечная цель - заменить высоту в topo.msg значениями высоты в topo.rams.

topo.rams:
longitud,latitud,tempc,u,v,w,relhum,speed,topo
-1.7107, 38.1464, 18.2412, -6.1744, -0.3708, 0.0000, 58.6447, 6.3584,460.5908
-1.7107, 38.1734, 18.5915, -5.7757, -0.3165, 0.0000, 61.8492, 5.9840,416.0403

topo.msg
height,longitud,latitud
448.0, 1.70, 38.14
402.0, 1.70, 38.18

и желаемый результат (измененный topo.msg)

height,longitud,latitud
460.5908, 1.70, 38.14
416.0403,  1.70, 38.18

и используемый код

#lectura de datos
topo.msg=read.csv("MSG_DEM.txt",sep=",",header=FALSE)
colnames(topo.msg) <- c("topoMSG","longitud","latitud")

topo.rams=read.csv("topografia-rams.txt",sep=",",header=TRUE)

# número de estaciones a tratar
puntos.rams=dim(topo.rams)[1]
puntos.msg=dim(topo.msg)[1]

# Localización del punto de MSG más próximo a la estación.
# Se calcula la distancia a partir de las coordenadas lat-lon

topo.temp=data.frame()

for(i in 1:puntos.rams)
{
  for(j in 1:puntos.msg) 
  {
  dlon<-topo.rams$longitud[i]-topo.msg$longitud

  if ( dlon < 0.5 && dlat < 0.5) {

    dlat<-topo.rams$latitud[i]-topo.msg$latitud

    if ( dlat < 0.5) {
       n1<-n1+1
       distancia=sqrt(dlon*dlon+dlat*dlat)

      }
    }
  indexj=which.min(distancia)
  }

  topo.msg$topo[indexj] = topo.rams$topo[i]

}

Этот код вроде бы запускается, но занимает очень много времени. Я также попытался создать матрицу расстояний с пакетом геосферы из сообщения в Географическое расстояние между 2 списками координат широта / долгота Но R жалуется на выделение 3,6 Гб.

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

заранее спасибо


person pacomet    schedule 10.12.2015    source источник
comment
Работают ли эти методы в вашем случае? Если вы можете перенести свои вычисления в матричные вычисления, а затем даже применить многопоточную библиотеку (openBLAS) или графический процессор к R.   -  person Patric    schedule 10.12.2015


Ответы (1)


Из комментария Патрика я переключился с цикла на вычисление матрицы / вектора. Теперь код работает, стал проще и эффективнее.

for(i in 1:puntos.rams) 
{
  dlon<-topo.rams$longitud[i]-topo.msg$longitud
  dlat<-topo.rams$latitud[i]-topo.msg$latitud
  distancia<-matrix(sqrt(dlon*dlon+dlat*dlat))
  indexj=which.min(distancia)
  topo.temp$topo[indexj] = topo.rams$topo[i]
}

Вероятно, есть более элегантный способ сделать этот расчет. Буду признателен за любой вклад.

person pacomet    schedule 11.12.2015