[Résolu] boucle read files

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

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

[Résolu] boucle read files

Messagepar Laëtitia VIBERT » 29 Avr 2019, 16:36

Bonjour,

j'aimerais savoir si, lorsque je fais une boucle pour lire un par un les fichiers d'un dossier, il y a un moyen de n'appeler qu'une partie du nom du fichier ci celui-ci est unique, et non le nom du fichier en entier ?
Je m'explique : pour chaque individu, repéré par son id, je veux lire le fichier qui lui correspond, qui est de la forme "ADE_[id_indiv]_[numéro_du_trajet]_bout.txt", dans un dossier cible spécifié au début du script. Exemple : "ADE_20190130_5261174_1_Dve_Bout.txt", ou bien "ADE_20181229_6070564_5_Dve_Bout.txt"
Or, certains fichiers ont été corrigés, et ont pour nom "ADE_[id_indiv]_[numéro_trajet]_bout_corr.txt", du coup, faut-il que je trouve un autre moyen de nommer mes fichiers, ou bien il existe une formule d'appel me permettant de spécifier uniquement l'id de l'individu ? Par exemple, une formule permettant de lire un à un tous les fichiers du dossier dans l'ordre, sans avoir à spécifier le nom...
Question subsidiaire : j'aimerais optimiser cette boucle car tous les individus n'ont pas le même nombre de trajets...

Code : Tout sélectionner

# script de base

setwd(dossier_cible) #là, je ne sais pas comment rendre ça reproductible
id <- as.character(c(1:120))  #simplifié, dans mon jeu de données, l'id est plus long et complexe, mais unique
for (a in 1:nrow(id)) { #
   for (j in 1:8) {
        name_file <- paste("ADE_",id[a],[j],"_bout.txt")  #cette boucle n'est d'ailleurs pas optimale, car tous les indiv ne font pas 8 trajets, et je dois passer ceux pour qui le fichier n'existe pas...
        Logger <- read.table(name_file,header=T,sep="\t", dec=",")
        #suite du script...
   }
   
}


J'espère avoir été claire et reproductible ;-)
Merci pour votre aide
L.
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: boucle read files

Messagepar Pierre-Yves Berrard » 30 Avr 2019, 07:41

Bonjour,
Laëtitia VIBERT a écrit :Par exemple, une formule permettant de lire un à un tous les fichiers du dossier dans l'ordre, sans avoir à spécifier le nom...

Vous pouvez utiliser la fonction list.files.
Comme son nom l'indique, elle permet de lister tous les fichiers d'un répertoire.

Il est possible d'affiner avec le paramètre pattern, une expression régulière.
Dans votre cas quelque chose comme :

Code : Tout sélectionner

list.files(pattern = "ADE_[0-9]{8}_[0-9]+_[0-9]+_.+_Bout(_corr)?\\.txt")
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: boucle read files

Messagepar Logez Maxime » 30 Avr 2019, 07:48

Bonjour,

tu peux pour chaque individus repérer les fichiers dans ton dossier qui contiennent l'id de l'individu et ensuite n'importer que ces fichiers :

Code : Tout sélectionner

id <- as.character(c(1:120))
for (i in id) {
  l1 <- list.files(path = "ton repertoire", patt = sprintf("ADE_%s_.*\\.txt$", i))
  for (j in seq_len(l1)) { #ou directement for (j in l1) associé avec read.table(j, ....)
    Logger <- read.table(l1[j],header=T,sep="\t", dec=",")
        #suite du script...
    }
  }
Cordialement,
Maxime

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: boucle read files

Messagepar Laëtitia VIBERT » 02 Mai 2019, 12:59

Bonjour,
merci pour vos réponses.
Maxime, malheureusement, je ne comprend pas tout à fait votre boucle, et malheureusement, j'aurais du mieux choisir mon exemple, car en réalité, les id sont des identifiants complexes qui ne se suivent pas, je ne peux donc pas utiliser la boucle for (i in 1:id).

Bon, déjà, avec le list.files de Pierre-Yves Berrard, je pense tenir un bon bout, potentiellement les entrer 1 à 1 dans une liste en as.character, puis utiliser cette chaîne de caractères avec une boucle allant de 1 à nrow(liste) ?

Merci pour votre aide
L.
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: boucle read files

Messagepar Pierre-Yves Berrard » 02 Mai 2019, 13:27

Laëtitia VIBERT a écrit :Bon, déjà, avec le list.files de Pierre-Yves Berrard, je pense tenir un bon bout, potentiellement les entrer 1 à 1 dans une liste en as.character, puis utiliser cette chaîne de caractères avec une boucle allant de 1 à nrow(liste) ?

Vous pouvez stocker le résultat de list.files (un vecteur) dans un objet R :

Code : Tout sélectionner

mes_fichiers <- list.files(pattern = "ADE_[0-9]{8}_[0-9]+_[0-9]+_.+_Bout(_corr)?\\.txt")

Ensuite, il reste effectivement à boucler sur ces noms de fichiers pour importer les données, avec for ou lapply. Je trouve la deuxième manière plus simple :

Code : Tout sélectionner

mes donnees <- lapply(
  mes_fichiers,
  read.table,
  # arguments supplémentaires pour read.table
  header = TRUE,
  sep = "\t" ,
  dec = ","
)
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: boucle read files

Messagepar Logez Maxime » 02 Mai 2019, 13:30

re,

C'est bien parce que les identifiants sont complexes que je n'ai pas écrit de "for i in 1:id" mais "for i in id". Du coup a chaque itération i prend pour valeur un identifiant. Ça nécessite que id soit un vecteur qui contiennent tous tes identifiants, quel que soit leur nature. Ce "i" sert ensuite dans le sprintf pour construire une chaîne de caractère qui soit proche de tes noms de fichiers et qui intègrent ton identifiant. Cette chaîne de caractère est ensuite passer à la fonction list.files pour rechercher dans ton dossier tout les noms de fichiers qui commencent par "ADE_", qui sont suivis par ton identifiant et qui contiennent .txt à la fin. Tous les noms de fichiers qui correspondent sont stockés dans un vecteur l1 qui peut être de taille différente selon les id.
Ensuite intervient la boucle sur j qui va prendre pour valeur de 1 à la longueur de l'objet l1, soit le nombre de fichiers avec ton identifiant.
Dans cette boucle sur j tu vas ainsi récupérer chaque nom de fichier avec l1[j] et le lire avec read.table.

Cordialement,
Maxime

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: boucle read files

Messagepar Laëtitia VIBERT » 02 Mai 2019, 13:59

Merci, en combinant vos conseils, j'obtiens satisfaction, Maxime Logez, je ne peux pas créer le vecteur qui servira pour les id, j'ai trop d'indiv, le but de ce script étant d'automatiser tout pour faire tourner pendant le week-end, et ainsi d' éviter la saisie fastidieuse des id de chaque indiv.

Code : Tout sélectionner

setwd(path_file_bout) #repertory/folder where are loaded files to read
l1 <- list.files(pattern = "ADE_[0-9]{8}_[0-9]+_[0-9]+_.+_Bout(_corr)?\\.txt") #records all files from directory as character into a list, to read them in the loop
for (i in 1:length(l1)) { #loop on trip i.e. for each file
  bout.tab <- fread(list.files(pattern = l1[i]), data.table=F, skip = 2, na.strings=c("","NA"))
  #etc


Merci beaucoup pour votre aide =)

PS: question subsidiaire, du coup, je ne passe pas par l'id comme j'ai l'habitude de faire. Y a-t-il un moyen de récupérer juste la chaîne de caractères correspondant à l'id par exemple "20180119_5050555" ?

L.
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: boucle read files

Messagepar Pierre-Yves Berrard » 02 Mai 2019, 14:21

Réutiliser list.files à l'intérieur de la boucle est redondant, on peut simplement écrire :

Code : Tout sélectionner

bout.tab <- fread(l1[i], ....)

Laëtitia VIBERT a écrit :PS: question subsidiaire, du coup, je ne passe pas par l'id comme j'ai l'habitude de faire. Y a-t-il un moyen de récupérer juste la chaîne de caractères correspondant à l'id par exemple "20180119_5050555" ?

Code : Tout sélectionner

ids <- sub("ADE_([0-9]{8}_[0-9]+)_[0-9]+_.+_Bout(_corr)?\\.txt", "\\1", l1)
Noter les deux parenthèses supplémentaires par rapport à la chaîne utilisée dans list.files. Celles-ci servent à "capturer" l'identifiant.

On aurait pu aussi utiliser regexpr ou stringr::str_match.
PY

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: boucle read files

Messagepar Laëtitia VIBERT » 02 Mai 2019, 14:36

Ah yes, c'est parfait, avec "unique" devant, c'est pile poil ! =)

Merci beaucoup !!
L.


Retourner vers « Questions en cours »

Qui est en ligne

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