2016-11-26 4 views
0

Je joue avec un grand jeu de données (~ 1.5m lignes x 21 colonnes). Qui comprend une longue information lat d'une transaction. Je calcul de la distance de cette opération de deux emplacements cibles et annexant cela comme nouvelle colonne ensemble de données principal:Rendre le calcul de boucles et spatiaux plus rapide?

TargetLocation1<-data.frame(Long=XX.XXX,Lat=XX.XXX, Name="TargetLocation1", Size=ZZZZ) 
TargetLocation2<-data.frame(Long=XX.XXX,Lat=XX.XXX, Name="TargetLocation2", Size=YYYY) 

## MainData[6:7] are long and lat columns 

MainData$DistanceFromTarget1<-distVincentyEllipsoid(MainData[6:7], TargetLocation1[1:2]) 
MainData$DistanceFromTarget2<-distVincentyEllipsoid(MainData[6:7], TargetLocation2[1:2]) 

J'utilise distVincentyEllipsoid fonction de package geosphere() pour calculer les distances. Comme vous pouvez l'imagerie, distVincentyEllipsoid fonction est un calcul intensif, mais il est plus précis (par rapport aux autres fonctions du même paquet distHaversine(); distMeeus(); distRhumb(); distVincentySphere())

Q1) Il me faut environ 5-10 minutes pour calculer les distances pour chaque emplacement cible [I avoir 16 Go de RAM et CPU Intel i7 6600U 2.81Ghz], et j'ai plusieurs emplacements cibles. Y a-t-il un moyen plus rapide de faire cela? Q2) Ensuite, je crée une nouvelle colonne pour une variable catégorielle pour marquer chaque transaction si elle appartient à la définition du marché des emplacements cibles. Une boucle for avec 2 if instructions. Y a-t-il un autre moyen de rendre ce calcul plus rapide?

MainData$TransactionOrigin<-"Other" 

    for (x in 1:nrow(MainData)){ 
    if (MainData$DistanceFromTarget1[x]<=7000) 
    MainData$TransactionOrigin[x]="Target1" 
    if (MainData$DistanceFromTarget2[x]<=4000) 
    MainData$TransactionOrigin[x]="Target2" 
} 

Merci

+0

C'est un problème fascinant. J'ai deux questions. (1) Avez-vous des points quasi-antipodaux? La formule de Vincenty converge très lentement vers des points quasi-antipodaux. (2) Avez-vous besoin de la précision supplémentaire? Utilisez-vous réellement les distances, ou utilisez-vous simplement les catégories? Dans ce dernier cas, il est peu probable que vous ayez beaucoup de valeurs catégorielles (ou, en fait, toutes) qui sont modifiées en utilisant les algorithmes les plus rapides. – JWLM

Répondre

0

En ce qui concerne Q2
Ce sera beaucoup plus rapide si vous perdez la boucle.

MainData$TransactionOrigin <- "Other" 
    MainData$TransactionOrigin[which(MainData$DistanceFromTarget1[x]<=7000)] <- "Target1" 
    MainData$TransactionOrigin[which(MainData$DistanceFromTarget2[x]<=4000)] <- "Target2"