2013-08-20 4 views
1

J'ai de grandes trames de données constituées de paires de coordonnées X et Y, et je souhaite calculer les distances euclidiennes entre les coordonnées suivantes (la taille minimale est d'environ 2000 paires de coordonnées) - ainsi, la distance de la ligne 1 à 2, ligne 2 à 3, ligne 3 à 4, etc. This question montre bien comment calculer la distance euclidienne entre le premier et le dernier point pour les données de la piste, mais mes données sont plus proches:Calcul des distances euclidiennes entre les positions suivantes dans R

dff < -structure (liste (A = c (0L, 0L, 0L, 0L, 0L, 0L), T = 0: 5, X = c (668L, 670L, 672L, 674L, 676L, 678L), Y = c (259L, 259L, 259L, 259L, 259L, 260L), V = c (NA, 0, 0, 0, 0, 0)), .Names = c ("A", "T", "X", " Y "," V "), row.names = c (NA, 6L), class = "data.frame")

Il semble qu'il devrait y avoir un moyen de créer une boucle pour ce faire, mais je ne suis pas sûr de savoir comment l'inscrire. L'utilisation de dist() est exigeante sur le plan informatique pour les ensembles de données de cette taille et, de toute façon, je ne suis pas sûr non plus de savoir comment extraire des éléments matriciels uniques de la diagonale.

+0

Avez-vous regardé le paquet 'sp'? – Frank

Répondre

3

Quelque chose comme

sqrt(diff(dff$X)^2 + diff(dff$Y)^2) 

devrait fonctionner. La clé est la fonction diff ici, ce qui donne des différences entre les éléments consécutifs dans un vecteur

1

Une autre approche, juste pour le plaisir:

sqrt(apply(apply(dff[,c("X","Y")], 2, diff)^2, 1, sum)) 
Questions connexes