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

  1. #1
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : juin 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Manipulation de données : remplacement d'une valeur par la valeur de la ligne précédente dans un dataframe
    Bonjour
    j'ai un tableau de données avec des lignes redondantes pour lesquels j'ai différents résultats (différente espèces) concernant la culture de Campylobacter.
    Je souhaite supprimer ces lignes redondantes mais récupérer le résultat et l'inscrire dans une nouvelle colonne.
    Pour cela j'ai essayé de créer une boucle mais il semble que ma méthode de fonctionne pas.
    Mon dataset se nomme "camp" avec l'identifiant des animaux se nommant "PETRIID" les résultats pour la culture de Campylobacter "Screening".
    J'ai créer des colonnes supplémentaires pour chaque niveau de résulte (chaque espèce).
    Pour info j'ai comme résultat à
    date.sampled clinic PETRIID Sex Age.days. Vaccination Breed
    05/03/2014:102 Hamanskraal :112 D10 A : 2 : 66 Min. : 10.0 0 :254 Pitbull :189
    12/11/2014: 84 Loate :226 D11 21-3: 2 F:251 1st Qu.: 46.0 1 :112 Crossbreed:155
    02/12/2014: 52 Mamelodi :146 D11 24-2: 2 M:196 Median : 82.0 2 : 55 : 56
    15/01/2014: 51 Sonskynehoekie: 29 D11-15 : 2 Mean : 247.2 3 : 54 Boerboel : 29
    20/11/2013: 50 D11-20 : 2 3rd Qu.: 263.8 NA's: 38 Jack Rasel: 27
    12/04/2014: 44 D11-32 : 2 Max. :3600.0 Staffie : 22
    (Other) :130 (Other) :501 NA's :47 (Other) : 35
    Screening
    C. coli : 26
    C. jejuni :138
    C. upsalensies: 65
    Negative :284



    Camp Campcoli Campjejuni Campups
    Min. :0.0000 Min. :0.00000 Min. :0.000 Min. :0.0000
    1st Qu.:0.0000 1st Qu.:0.00000 1st Qu.:0.000 1st Qu.:0.0000
    Median :0.0000 Median :0.00000 Median :0.000 Median :0.0000
    Mean :0.4464 Mean :0.05068 Mean :0.269 Mean :0.1267
    3rd Qu.:1.0000 3rd Qu.:0.00000 3rd Qu.:1.000 3rd Qu.:0.0000
    Max. :1.0000 Max. :1.00000 Max. :1.000 Max. :1.0000

    Pour retrouver mes duplicata j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    which(duplicated(camp$PETRIID))
    summary(camp[which(duplicated(camp$PETRIID)),])
    camp[which(duplicated(camp$PETRIID)),c(3,4,7,8)]
    Ensuite j'essaie donc de mettre mes résultats de la ligne redondante (qui se trouve toujours en dessous de la ligne ayant le même identifiant) dans une nouvelle colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i in which(duplicated(camp$PETRIID))) {
    camp[(i-1),camp$Campcoli]<-ifelse(camp[i,camp$Screening]=="C. coli",1,camp[(i-1),camp$Campcoli])
    	}
    Error in `[<-.data.frame`(`*tmp*`, (i - 1), camp$Campcoli, value = list( :
    duplicate subscripts for columns
    Ne marche pas donc;
    Si je fait comme si je créais une nouvelle colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i in which(duplicated(camp$PETRIID))) {
    camp[(i-1),camp$Campcoli2]<-ifelse(camp[i,camp$Screening]=="C. coli",1,camp[(i-1),camp$Campcoli])
     	}
    je n'ai pas de message d'erreur mais quand je vérifie la colonne Campcoli2 n'existe pas et n'a pas été crée ce qui est peut être assez logique car elle n'a pas le même nombre de lignes que le dataframe.
    J'ai alors essayé la fonction if et ensuite else
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i in which(duplicated(camp$PETRIID))) {
    if(camp[i,camp$Screening]=="C. coli") {1}else({camp[(i-1),camp$Campcoli]})
    	}
    There were 32 warnings (use warnings() to see them)
    > warnings()
    Messages d'avis :
    1: In if (camp[i, camp$Screening] == "C. coli") { ... :
    la condition a une longueur > 1 et seul le premier élément est utilisé
    ...
    Bref si quelqu'un a une idée pour cette manipulation qui sous Excell est relativement simple avec la fonction "SI"

    Par ailleurs pour supprimer ensuite mes duplicata j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    campb<-camp[unique(camp$PETRIID),]
    et j'ai vérifier pour un certain duplicata
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    campb[campb$PETRIID=="D10 A",]
    et je me rends compte que ça ne l'a pas enlevé mais d'autres lignes ont du être supprimée car j'ai bien 32 lignes de moins (nombre de mes duplicata)
    Si j'essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    camp2<-camp[!duplicated(camp$PETRIID),]
    dim(camp2)
    camp2[camp2$PETRIID=="D10 A",]
    Ca marche.
    Là aussi si quelqu'un peut me dire pourquoi la fonction "unique" ne fonctionne pas je suis preneur.
    Merci d'avance
    Eric

  2. #2
    Membre expérimenté
    Inscrit en
    novembre 2009
    Messages
    701
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 701
    Points : 1 309
    Points
    1 309
    Par défaut Jumeler des lignes avec le même identifiant
    Bonjour,

    Je pense que vous pouvez résoudre votre problème à l'aide de la fonction reshape(). Vous pouvez voir un exemple d'utilisation ici.

    Si vous ne réussissez pas, pouvez-vous fournir un extrait de votre fichier au format csv ? (Il faut remplacer l'extension csv par txt pour pouvoir télécharger le fichier).

    Cordialement,

  3. #3
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : juin 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci, ça marche même si ça demande ensuite un peu de manipulation.
    Par contre auriez-vous une idée du pourquoi ma boucle avec la fonction ne fonctionne pas?
    Par ailleurs auriez-vous également une idée sur la seconde partie de ma question : pourquoi ne fonctionne pas correctement par rapport à ?
    Eric

  4. #4
    Membre expérimenté
    Inscrit en
    novembre 2009
    Messages
    701
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 701
    Points : 1 309
    Points
    1 309
    Par défaut Manipulation de données : remplacement d'une valeur par la valeur de la ligne précédente dans un dataframe
    Merci, ça marche même si ça demande ensuite un peu de manipulation.
    Merci pour votre retour. Je pense qu'il ne faut pas raisonner en boucles et qu'il est préférable de les éviter lorsque cela est possible. Vous pouvez certainement simplifier votre programme en faisant les manipulations avant la transposition des données plutôt qu'après.


    Auriez-vous une idée du pourquoi ma boucle avec la fonction ifelse() ne fonctionne pas?
    Je pense que vous n'accédez pas correctement aux variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    > df <- data.frame(ID=c(051,051,054,054,055,055),
    +                  NO=c(7,8,7,8,7,8),
    +                  DATE=c(2009,2014,2009,2014,2009,2014))
    > df[,df$ID]
    Error in `[.data.frame`(df, , df$ID) : undefined columns selected
    > df[,"ID"]
    [1] 51 51 54 54 55 55

    Par ailleurs auriez-vous également une idée sur la seconde partie de ma question : pourquoi unique() ne fonctionne pas correctement par rapport à !duplicated()?
    Les fonctions unique() et !duplicated() ne renvoient pas le même résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > unique(df$ID)
    [1] 51 54 55
    > !duplicated(df$ID)
    [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE
    Cordialement,

  5. #5
    Candidat au Club
    Homme Profil pro
    Vétérinaire
    Inscrit en
    juin 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Vétérinaire

    Informations forums :
    Inscription : juin 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci encore.
    J'ai repris ma boucle (malgré tout) et l'ai retravaillée d'après vos indication et maintenant effectivement elle fonctionne.
    J'ai donc utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i in which(duplicated(camp$PETRIID))) {
    camp[(i-1),"Campcoli"]<-ifelse(camp[i,"Screening"]=="C. coli",1,camp[(i-1),"Campcoli"])
    camp[(i-1),"Campjejuni"]<-ifelse(camp[i,"Screening"]=="C. jejuni",1,camp[(i-1),"Campjejuni"])
    camp[(i-1),"Campups"]<-ifelse(camp[i,"Screening"]=="C. upsalensies",1,camp[(i-1),"Campups"])	
    	}
    et après vérification cela fonctionne.
    Je reconnais qu'on avance un peu dans le flou avec la boucle car il faut être certain que les duplicata sont bien tous les uns en dessous des autres (mais je l'avais vérifié auparavant). Par ailleurs on n'obtient pas l'avertissement comme avec la fonction
    reshape()
    suivant
    In reshapeWide(data, idvar = idvar, timevar = timevar, varying = varying, :
    multiple rows match for Screening=C. upsalensies: first taken
    qui m'a permis de revenir à mes données et de les vérifier car effectivement il y avait des erreurs de retranscription et les lignes n'étaient pas exactement identiques.
    Bonne journée
    Eric

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/02/2014, 15h52
  2. remplacer une variable par sa valeur dans une chaine
    Par regis1_1 dans le forum Langage
    Réponses: 5
    Dernier message: 12/05/2013, 12h07
  3. Réponses: 3
    Dernier message: 03/01/2012, 11h16
  4. Réponses: 3
    Dernier message: 10/06/2011, 10h51
  5. remplacer une variable par sa valeur
    Par patbeautifulday1 dans le forum Access
    Réponses: 3
    Dernier message: 05/01/2007, 17h06

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