Créer une boucle pour changer le type de variable

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

Tai PHAM
Messages : 47
Enregistré le : 18 Jan 2011, 11:58

Créer une boucle pour changer le type de variable

Messagepar Tai PHAM » 15 Jan 2018, 00:00

Bonjour,
j'ai une base de données avec des patients suivis quotidiennement pendant 100 jours.
A chaque journée, correspond une variable d'identification (date_J1; date_J2...date_J100)

Pour que R reconnaisse la variable comme date, il faut que j'utilise le script

Code : Tout sélectionner

db$date_J1<-as.Date(db$date_J1,"%d/%m/%Y")
db$date_J2<-as.Date(db$date_J2,"%d/%m/%Y")
...
db$date_J100<-as.Date(db$date_J100,"%d/%m/%Y")


C'est possible mais très rébarbatif de le faire manuellement (et avec un risque important d'erreur).

Existe-t-il un moyen d'automatiser le processus?

Merci de votre aide.

Tài

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

Re: Créer une boucle pour changer le type de variable

Messagepar Serge Rapenne » 15 Jan 2018, 08:37

Bonjour,

Pour ce genre de chose, l'idée la plus simple est de chercher les colonnes concernées avec grep puis d'appliquer la fonction de transformation à ces colonnes.

Une solution parmi d'autre avec les fonctions standard de R:

Code : Tout sélectionner

l_motif<-grepl("date_J",colnames(db))
db[,l_motif]<-as.Date(db[,l_motif],"%d/%m/%Y")


Une autre possibilité serait d'utiliser la fonction mutate_at du package dplyr

Serge

Tai PHAM
Messages : 47
Enregistré le : 18 Jan 2011, 11:58

Re: Créer une boucle pour changer le type de variable

Messagepar Tai PHAM » 15 Jan 2018, 19:00

Merci de votre réponse.
J'ai essayé votre script mais malheureusement, cela n'aboutit pas au résultat escompté.

Code : Tout sélectionner

l_motif<-grepl("date_J",colnames(db))


Aboutit à une matrice logique "l_motif" où tout est considéré "False". J'ai l'impression que le pattern "date_J" sans préciser le nombre correspondant à la date n'est pas reconnu.

Cordialement,

Tài

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

Re: Créer une boucle pour changer le type de variable

Messagepar Serge Rapenne » 16 Jan 2018, 08:26

et pourtant :

Code : Tout sélectionner

exemple<-c(paste0("date_J",1:4),LETTERS[1:3])
exemple
[1] "date_J1" "date_J2" "date_J3" "date_J4" "A"       "B"       "C"   

grep("date_J",exemple) 
[1] 1 2 3 4
#ou
 grepl("date_J",exemple)
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE


peux tu fournir le résultat de la commande dput(db[1:3,]) sur le forum

Serge

Tai PHAM
Messages : 47
Enregistré le : 18 Jan 2011, 11:58

Re: Créer une boucle pour changer le type de variable

Messagepar Tai PHAM » 27 Aoû 2018, 16:04

Cher Serge,
merci de votre réponse. Désolé du temps de latence mais je n'avais pas vu que vous m'aviez répondu.
Vous avez raison, les fonctions grep et grepl fonctionnent parfaitement.

Pour reprendre mon exemple initial, je n'arrive cependant pas à transformer l'ensemble de mes variables sélectionnées en date en utilisant votre exemple de script

Code : Tout sélectionner

l_motif<-grep("date_J",colnames(db))

> l_motif
 [1]  107  190  273  327  381  435  489  543  597  651  705  759  813  867  921  975 1029 1083 1137 1191
[21] 1245 1299 1353 1407 1461 1515 1569 1623

> db[,l_motif]<-as.Date(db[,l_motif],"%d/%m/%Y")

Error in as.Date.default(db[, l_motif], "%d/%m/%Y") :
  incapable de convertir 'db[, l_motif]' dans la classe “Date”



Mes variables semblent être au bon format pour être converties en dates (et d'ailleurs, elles ne posent pas de problème lorsque je les transforme une par une)

Code : Tout sélectionner

 > summary(life[,l_motif])
       date_J1          date_J2          date_J3          date_J4          date_J5          date_J6   
 05/01/2015:  4   06/01/2015:  4   07/01/2015:  4   08/01/2015:  4   15/07/2015:  3   16/07/2015:  3 
 10/01/2015:  3   11/01/2015:  3   12/01/2015:  3   14/07/2015:  3   16/09/2014:  3   17/09/2014:  3 
 11/07/2015:  3   12/07/2015:  3   13/07/2015:  3   15/09/2014:  3   19/03/2015:  3   20/03/2015:  3 
 12/09/2014:  3   13/09/2014:  3   14/09/2014:  3   18/03/2015:  3   19/07/2014:  3   20/07/2014:  3 
 15/03/2015:  3   16/03/2015:  3   17/03/2015:  3   18/07/2014:  3   25/02/2015:  3   26/02/2015:  3 
 15/07/2014:  3   (Other)   :328   (Other)   :314   (Other)   :291   (Other)   :271   (Other)   :243 
 (Other)   :331   NA's      :  6   NA's      : 20   NA's      : 43   NA's      : 64   NA's      : 92   


Avez-vous une idée de la raison pour laquelle je ne peux pas transformer mes variables d'intérêt en date?

Merci de votre aide!

Tài

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Créer une boucle pour changer le type de variable

Messagepar François Bonnot » 29 Aoû 2018, 07:43

Bonjour,
Il pourrait être plus efficace de stocker les données dans la base sous forme d' une table comprenant une colonne "patient", une seule colonne date (donc 100 lignes par patient) et des colonnes de données correspondantes.
S'il n'est pas possible de modifier la base, on peut toujours transformer le data frame sous R avec (par exemple) la fonction reshape (du format "wide" vers le format "long"), puis ensuite reformatter l'unique colonne date.
François

Tai PHAM
Messages : 47
Enregistré le : 18 Jan 2011, 11:58

Re: Créer une boucle pour changer le type de variable

Messagepar Tai PHAM » 29 Aoû 2018, 13:32

Merci de votre suggestion.
En réalité la base de donnée est initialement "1 ligne par date" et c'est moi qui ai utilisé la fonction "reshape" pour avoir une ligne par patient.
Je n'avais pas pensé à la solution qui me parait maintenant évidente, de convertir les variables avant de mettre ma base au format "wide"!

Merci beaucoup pour le conseil.

Bien à vous,

Tài


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité