Manipulation de données : remplacement d'une valeur par la valeur précédente dans un dataframe

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Etter
Messages : 4
Enregistré le : 17 Déc 2004, 09:55

Manipulation de données : remplacement d'une valeur par la valeur précédente dans un dataframe

Messagepar Etter » 05 Juin 2017, 07:23

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 à

Code : Tout sélectionner

summary(camp)

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

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 : Tout sélectionner

campb<-camp[unique(camp$PETRIID),]

et j'ai vérifier pour un certain duplicata

Code : Tout sélectionner

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 : Tout sélectionner

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

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Manipulation de données : remplacement d'une valeur par la valeur précédente dans un dataframe

Messagepar Gabriel Terraz » 05 Juin 2017, 09:10

Salut,
Cela n'engage que moi mais ton post est très lourd à lire, notamment du fait de l'absence de balise de code... Tu pourrais simplifier, nous donner un exemple du tableau que tu as et ce que tu veux obtenir, en quelques lignes. Voir ce lien http://forums.cirad.fr/logiciel-R/viewtopic.php?f=1&t=7638

Cela n'engage que moi et peut-être que d'autres personnes répondront tout de même !

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Manipulation de données : remplacement d'une valeur par la valeur précédente dans un dataframe

Messagepar Serge Rapenne » 05 Juin 2017, 11:44

Absolument d'accord, avec Gabriel, ton message ne donne absolument envie de le lire, je n'ai d'ailleurs pas eu le courage de le faire.

Serge

Alexandre Dangléant
Messages : 270
Enregistré le : 30 Mar 2010, 14:38

Re: Manipulation de données : remplacement d'une valeur par la valeur précédente dans un dataframe

Messagepar Alexandre Dangléant » 15 Juin 2017, 13:43

Bonjour,

J'ai eu le courage de lire le premier paragraphe :-)

Pour ce que tu veux faire, regarde la fonction dcast du package reshape2 qui a exactement cet objectif (mais je n'ai pas tout saisi de ton cas...). Il doit en exister d'autres, mais celle là est relativement simple à utiliser. N'hésite pas à revenir ici si tu as des problèmes.

Cordialement.

P.S : Par rapport au commentaire de Gabriel et Serge que je rejoins, je rajouterai qu'isoler un problème en cherchant à le reproduire sur un petit jeu de données de qq lignes (créé en ligne de codes, par exemple) m'a souvent permis de comprendre ce qui me bloquait, alors que mon premier objectif était de faire un post ici. Dans le cas contraire, cela permet de synthétiser et de ne pas décourager les lecteurs, tout en leur fournissant un code reproductible qu'ils peuvent donc rapidement tester pour voir ce qui cloche.
Je note quand même ta démarche de découper les étapes de ton code pour nous le rendre plus clair.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité