IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

calcul distance automatique en fonction de séquences


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut calcul distance automatique en fonction de séquences
    Bonjour,

    J'ai actuellement des tableaux de données contenant dans chaque ligne une séquence. Chaque chiffre correspond à un point de coordonnées x et y.

    0 1 2 3 4 5 6 7 8 0
    0 2 4 5 7 8 0
    0 1 5 8 3 0

    Chacun de ces tableaux fait 80 lignes, en revanche le nombre max de colonnes varie. Pour chaque séquence, je souhaite obtenir la distance en reliant les points dans l'ordre. J'utilise donc ce type de code : en considérant A comme ma matrice de séquences, pour que chaque séquence fasse la même longueur, je remplace les NA par des 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    A[is.na(A)] <- 0  
     
     
    X=c(400,400.1381972,393.1934251,295.5148688,121.6085368,200.0388769,166.1220046)
    Y=c(50,330.4807384,492.5948299,496.5508503,628.4060699,315.8271743,208.3168871)
     
     
    B=A
    C=A
     
    for (i in c(0:6)) # remplace les numéros de fleurs par leurs coordonnées X dans B et Y dans C
    {
      B[B==i]<-X[i+1]
      C[C==i]<-Y[i+1]
    }
     
    mat_distance=NULL# permet de creer un vecteur distance nul
     
    for (i in 1:nrow(A)) #boucle permettant d'obtenir la distance totale pour chaque combinaison
    { 
      Distance = sqrt(((B[i,2])-(B[i,1]))^2+((C[i,2])-(C[i,1]))^2) + sqrt(((B[i,3])-(B[i,2]))^2+((C[i,3])-(C[i,2]))^2) + sqrt(((B[i,4])-(B[i,3]))^2+((C[i,4])-(C[i,3]))^2) + sqrt(((B[i,5])-(B[i,4]))^2+((C[i,5])-(C[i,4]))^2) + sqrt(((B[i,6])-(B[i,5]))^2+((C[i,6])-(C[i,5]))^2) + sqrt(((B[i,7])-(B[i,6]))^2+((C[i,7])-(C[i,6]))^2) + sqrt(((B[i,8])-(B[i,7]))^2+((C[i,8])-(C[i,7]))^2)) 
      mat_distance=c(mat_distance,Distance) 
    }
     
    matfinal=cbind(A,distance=mat_distance)
    write.csv2(matfinal,file="Distanceséquence.csv")
    Mon problème ici est que mon code doit être modifié en fonction du nombre max de colonnes dans la formule de la distance. Quelqu'un aurait-il une idée pour automatiser le tout ? Merci d'avance pour vos réponses.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(sqrt(diff(X)**2+diff(Y)**2))

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je ne comprends pas comment cette formule doit être implantée dans mon code, car même en l'adaptant cela ne fonctionne pas.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    C'est le calcul de la somme des distances entre les points définis par les vecteurs X et Y, ce n'est pas ce que tu voulais ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    En fait, mes vecteurs X et Y sont les coordonnées de chaque point. Et ensuite, j'ai une matrice de différentes séquences de points. Ce que j'aimerais, c'est la distance de chaque séquence.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Votre formule est la bonne, je pense que c'est moi qui m'y prends mal. Au départ, j'ai ma matrice A de séquences :

    0 1 2 3 4 5 6 7 0
    0 1 4 5 7 2 6 5 0
    0 1 2 3 5 0
    0 1 2 3 0

    J'ai aussi à ma disposition les vecteurs contenant les X et les Y de chacun de mes 7 points:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X=c(400,400.1381972,393.1934251,295.5148688,121.6085368,200.0388769,166.1220046)
    Y=c(50,330.4807384,492.5948299,496.5508503,628.4060699,315.8271743,208.3168871)
    Cela me permet de créer une matrice B (pour les X) et C (pour les Y) à partir de ma matrice A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    B=A
    C=A
     
    for (i in c(0:6)) # remplace les numéros de fleurs par leurs coordonnées X dans B et Y dans C
    {
      B[B==i]<-X[i+1]
      C[C==i]<-Y[i+1]
    }
    Le problème est que si j'utilise votre formule en sélectionnant seulement la première ligne de chacune des matrices de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    D=sum(sqrt((diff(B[1,]))^2+(diff(C[1,]))^2))
    R m'affiche :
    Erreur dans r[i1] - r[-length(r):-(length(r) - lag + 1L)] :
    argument non numérique pour un opérateur binaire
    A priori, c'est la fonction diff qui ne fonctionne pas ici.

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    OK, je n'avais pas compris tout ce que tu voulais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A=t(matrix(c(1,2,3,4,5,6,7,8,2,4,5,7,8,NA,NA,NA,1,5,8,3,NA,NA,NA,NA),8))
    X=c(400,400.1381972,393.1934251,295.5148688,121.6085368,200.0388769,166.1220046)
    Y=c(50,330.4807384,492.5948299,496.5508503,628.4060699,315.8271743,208.3168871)
     
    distance = apply(A,1,function(a){
         sum(sqrt(diff(X[a])**2+diff(Y[a])**2),na.rm=T)
    })

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup c'était ce que je recherchais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Calcul automatique en fonction d'une base de donnée
    Par sebsrv dans le forum Excel
    Réponses: 3
    Dernier message: 06/03/2013, 14h30
  2. Calcule de distance avec la fonction distanceTo()
    Par etude_geo dans le forum IGN API Géoportail
    Réponses: 7
    Dernier message: 20/06/2012, 14h11
  3. calcul automatique en fonction de différentes données
    Par ronaud dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/06/2012, 15h14
  4. Réponses: 12
    Dernier message: 27/03/2006, 14h59
  5. Réponses: 5
    Dernier message: 21/03/2006, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo