2017-10-06 3 views
0

Dans un répertoire, j'ai 780 fichiers et j'ai besoin de les lier par lignes, en utilisant R, dans 78 fichiers différents, puis écrire un fichier .txt par fichier. Les noms de fichiers sont comme ceux-ci:Tables de données dans R avec des boucles for par des listes de fichiers avec correspondance de modèle

S1_S1_F1.xlsx 
S1_S2_F1.xlsx 
... 
S1_S5_F1.xlsx 
S1_S6_F2.xlsx 
... 
S1_S10_F2.xlsx 
S2_S1_F1.xlsx 

La première partie de l'expresion S1_(.*).xlsx répète 10 fois, puis change jusqu'à S78_(.*).xlsx, avec la deuxième partie changeant (.*)_S1(.*).xlsx-(.*)S10(.*).xlsx. J'ai besoin de combiner les fichiers juste par le second terme pour avoir 78 fichiers de S1.txt à S78.txt.

Je suis loin d'être un expert en R, donc mon approche était de le faire fichier par fichier avec le code suivant:

S1<-list.files(pattern = "^S1(.*).xlsx") 
S1<-lapply(S1,read_excel) 
S1 <- bind_rows(S1) 
write.table(S1, "S1.txt", sep="\t",row.names=FALSE) 

jusqu'à

S78<-list.files(pattern = "^S78(.*).xlsx") 
S78 <-lapply(S78,read_excel) 
S78 <- bind_rows(S78) 
write.table(S78, "S1.txt", sep="\t",row.names=FALSE) 

Comme vous pouvez le voir , ce code semble avoir été écrit par un Australopithecus (ce que je ne suis pas), alors je demande votre aide! Comment puis-je le faire avec une boucle for?

+0

Ce qui ne fonctionne pas? Erreur? Résultats non désirés? – Parfait

+0

@Parfait Cela fonctionne, mais je veux juste améliorer le code avec une boucle for pour l'appliquer à un autre répertoire avec 10 fois plus de fichiers. Sinon, je vais tout recommencer de la même façon. – jealcalat

Répondre

0

Enroulez une autre lapply (qui est une boucle) autour de vos lignes Itère la séquence de 1 à 78. ci-dessous la sortie 78 fichiers txt et vous laisser une liste de 78 dataframes:

dfList <- lapply(seq(1,78), function(i) { 

    f <- list.files(pattern = paste0("^S", i, "(.*).xlsx")) 
    dfs <- lapply(f, read_excel)  
    df <- bind_rows(dfs)   # OR base R'S do.call(rbind, dfs) 
    write.table(df, paste0("S", i, ".txt"), sep="\t", row.names=FALSE) 

    return(df) 
}) 

dfList[[1]] 
dfList[[2]] 
... 
dfList[[78]] 

Et utilisez même sapply pour renvoyer une liste nommée:

dfList <- sapply(paste0("S",seq(1,78)), function(i) { 

    f <- list.files(pattern = paste0("^", i, "(.*).xlsx")) 
    dfs <- lapply(f, read_excel) 
    df <- bind_rows(dfs) 
    write.table(df, paste0(i, ".txt"), sep="\t", row.names=FALSE) 

    return(df) 
}, simplify = FALSE) 

dfList$S1 
dfList$S2 
... 
dfList$S78 
+0

Cela a fonctionné parfaitement! Je vous remercie! – jealcalat

+0

Super! Je pensais que tu avais disparu pour toujours. Nous répondeurs retenons notre souffle pour que les OP répondent. S'il vous plaît ne pas oublier la façon StackOverflow de dire [merci] (https://meta.stackexchange.com/a/5235)! – Parfait