2017-09-26 9 views
1

Ich habe einen Datenrahmen mit mehr als 10 Millionen Zeilen. Ich möchte den Abstand zwischen den lat-lon-Paaren zählen und sie zu einer nem Spalte hinzufügen. Ich habe versucht, das Skript auszuführen (siehe unten), aber es dauert zu lange (mehr als 5 Stunden). Jeder Tipp, wie kann ich die Geschwindigkeit dieses Prozesses steigern? Ich benutze das Geosphären-Paket, um den Abstand zwischen den Lat-lon-Paaren zu zählen.Zähldistanz dauert zu lange

for (i in seq_len(nrow(dm_kekk))) 
{ 
dm_kekk$dist[i]<-distm (c(dm_kekk$lon[i], dm_kekk$lat[i]), 
         c(dm_kekk$lon_ok[i], dm_kekk$lat_ok[i]), 
         fun = distHaversine) 

} 

Danke !!!

Antwort

1

Geben Sie immer ein Beispiel für Ihre Daten und die Ausgabe, die Sie erwarten, um die Beantwortung der Frage ein wenig einfacher zu machen. Eine Option ist, dass Sie den Prozess einfach parallelisieren oder mit dplyr mutieren versuchen.

library(doParallel) 
cores <- detectCores() -1 
cl <- makeCluster(cores) 
registerDoParallel(cl) 

oper_dist <- foreach(i=1:seq_len(nrow(dm_kekk))) %dopar% { 
library(geosphere) 
    distm (c(dm_kekk$lon[i], dm_kekk$lat[i]), 
        c(dm_kekk$lon_ok[i], dm_kekk$lat_ok[i]), 
        fun = distHaversine) 
} 
stopCluster(cl) 
dm_kekk$dist <- do.call(c, oper_dist) 

Oder mutate

library(dplyr) 

dm_kekk %>% mutate(dist = distm(lon, lat, lon_ok, lat_ok, fun = distHaversine)) 
+0

Thx für die Antwort verwenden. Der dplyr-Weg gibt einen Fehler, der richtige Code sieht also so aus: 'muate (dist = distm (cbind (lon, lat), cbind (lon_ok, lat_ok), fun = distHaversine))'. – deaux

+0

HI @deaux, könnten Sie bitte die Frage als richtig markieren, wenn die Lösung funktioniert? Haben Sie auch Benchmarking durchgeführt, um herauszufinden, welche Lösung optimal ist? –

+0

Hallo @ Hanjo Jo'burg Odendaal! Der Weg ist viel schneller als der parallele Weg. Aber die Syntax von distm war falsch. Der richtige Code sieht folgendermaßen aus: 'mutate (dist = distm (cbind (lon, lat), cbind (lon_ok, lat_ok), fun = distHaversine))'. – deaux