2017-09-26 1 views
1

私は1000万行以上のデータフレームを持っています。 私はlat-lonペア間の距離を数え、それらをnem列に追加したいと思います。 私はスクリプトを実行しようとしましたが(下記参照)、時間がかかりすぎる(5時間以上)。 どのようなヒントをすればこのプロセスのスピードを上げることができますか?私は地圏のパッケージを使って、緯度と経度のペアの距離を数えます。カウント距離が長すぎます

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) 

} 

ありがとう!!!

答えて

1

あなたのデータの例と質問に答えることを期待している出力を常に与えてください。 1つの選択肢は、プロセスをパラレルにするか、dplyr突然変異を試してみることです。

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) 

またはあなたの答えをmutate

library(dplyr) 

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

Thxをを使用しています。 dplyrはエラーを起こすので、正しいコードは 'mutate(dist = distm(cbind(lon、lat)、cbind(lon_ok、lat_ok)、fun = distHaversine))'のようになります。 – deaux

+0

HI @deaux、解決策がうまくいけば問題を正しいものにしてください。また、ベンチマーキングを行って、最適なソリューションを見つけましたか? –

+0

hi @ Hanjo Jo'burg Odendaal! dplyrの方がはるかに速く、次に平行な方法です。しかしdistmの構文は間違っていました。正しいコードは 'mutate(dist = distm(cbind(lon、lat)、cbind(lon_ok、lat_ok)、fun = distHaversine))'のようになります。 – deaux

関連する問題