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 :

Data.frame : enlever la ligne (i+1) marche mais pas pour la ligne (i+2) ?


Sujet :

R

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Data.frame : enlever la ligne (i+1) marche mais pas pour la ligne (i+2) ?
    Bonjour,

    Dans un data.frame, j'étudie les évènements (1 à 42) en fonction de différents temps. Mon but est de calculer des temps de réactions par exemple.

    Mon fichier de base est un fichier txt du type col 1="Action" identifiée par un numéro et col2="Temps"

    Dans un premier temps, je trie les évènements qui m'intéressent (ici, 2,12 et 23) grâce à des lignes de types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data2<-data1[which(data1[,1]!="3"),]
    J'obtiens ainsi un fichier de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         Action   Temps
          23     2888
        12     2898
         2     3731
          12     4474
          23     6717
           12     6735
            2     7537
          12     8240
               ...       etc.
    J'enlève ensuite les doublons (par ex si j'ai 2 "12") qui se suivent j'enlève le second grâce à ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    l<-c(1:(nrow(dataB)-1))
    ligne.à.enlever<-list()
    for(i in l) {
      if(dataB[(i+1),1]==12 & dataB[(i),1]==12){
        ligne.à.enlever[[i+1]]<-(i+1)}}
     
    ligne.à.enlever<-unlist(ligne.à.enlever)
    dataB<-dataB[-ligne.à.enlever,]
    Pour enlever les valeurs en gras dans mon exemple, j'utilise le même code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    l<-c(1:(nrow(dataB)-1))
    ligne.à.enlever<-list()
    for(i in l) {
      if(dataB[(i+2),1]==12 & dataB[(i),1]==12){
        ligne.à.enlever[[i+2]]<-(i+2)}}
     
    ligne.à.enlever<-unlist(ligne.à.enlever)
    dataB<-dataB[-ligne.à.enlever,]
    Mais dans ce cas, j'ai le message d'erreur suivant :

    Erreur dans if (dataB[(i+2), 1] ==12 & dataB[(i), 1]== 12) { :
    valeur manquante là où TRUE / FALSE est requis
    J'ai parcouru les 20 dernières pages de ce forum et cherché sur le net, mais je n'ai rien trouvé qui puisse m'aider...

    Quelqu'un comprend-t-il cette erreur ?

  2. #2
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Sais-tu pour quelle valeur de i le script arrête de tourner ?

    Peut-être qu'en changeant l<-c(1:(nrow(dataB)-1)) par l<-c(1nrow(dataB)-2)) cela tournera.

    Pour un nombre n de lignes, arrivé à la ligne n-1 il ne peut pas trouver la ligne n+1 puisqu'il n'y en a que n...

    Bonne journée, à bientôt.

    Guinue

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Bonjour et merci pour votre réponse,

    Alors j'ai remplacé ce que vous m'aviez dit par l<-c(1:(nrow(dataB)-2)) (ce que vous m'aviez proposé l<-c(1nrow(dataB)-2) ne marchant pas...), ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > l<-c(1:(nrow(dataB)-2))
    > ligne.à.enlever<-list()
    > for(i in l) {
    +   if(dataB[(i+2),1]==dataB[(i),1]){
    +     ligne.à.enlever[[i]]<-(i)}}
    > 
    > ligne.à.enlever<-unlist(ligne.à.enlever)
    > dataB2<-dataB[-ligne.à.enlever,]

    Et là je n'ai plus mon message d'erreur et ça marche !

    Merci beaucoup !

  4. #4
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    De rien, effectivement, avait disparu avec le copier/coller...

    Au plaisir !

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/04/2013, 17h07
  2. Réponses: 4
    Dernier message: 08/01/2006, 19h26
  3. Code qui marche, mais pas la mise à jour
    Par Cablan dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 18h09
  4. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 13h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 23h21

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