2017-10-06 1 views
0

In einem Verzeichnis habe ich 780 Dateien und ich muss sie nach Zeilen mit R in 78 verschiedenen Dateien binden und dann eine .txt nach Datei schreiben. Die Namen der Dateien sind wie diese:Datentabellen in R mit for-Schleifen durch Listen von Dateien mit Mustererkennung

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

Der erste Teil des expresion S1_(.*).xlsx 10-mal wiederholt, dann ändert sich bis zu S78_(.*).xlsx, mit dem zweiten Teil (.*)_S1(.*).xlsx-(.*)S10(.*).xlsx ändern. Ich muss die Dateien nur durch den zweiten Ausdruck kombinieren, um 78 Dateien von S1.txt zu S78.txt zu haben.

Ich bin weit davon entfernt ein Experte in R ist, so mein Ansatz es Datei für Datei mit dem folgenden Code zu tun war:

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) 

bis zu

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) 

Wie Sie sehen können , dieser Code scheint von einem Australopithecus geschrieben worden zu sein (was ich nicht bin), also bitte ich um deine Hilfe! Wie kann ich das mit einer for-Schleife machen?

+0

Was funktioniert nicht? Error? Unerwünschte Ergebnisse? – Parfait

+0

@Parfait Es funktioniert, aber ich möchte nur den Code mit einer for-Schleife verbessern, um es auf ein anderes Verzeichnis mit 10-mal mehr Dateien anzuwenden. Ansonsten werde ich alles wieder genauso machen. – jealcalat

Antwort

0

einfach wickeln andere lapply (was eine Schleife ist) um Ihre Linien durch die Sequenz von 1 bis 78. Im Folgenden ausgeben wird der 78 TXT-Dateien und lassen Sie eine Liste von 78 Datenrahmen Iterieren:

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]] 

Und verwenden Sie sogar sapply, um eine benannte Liste zurückzugeben:

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

Es hat perfekt funktioniert! Vielen Dank! – jealcalat

+0

Großartig! Ich dachte, du wärst für immer verschwunden. Wir halten den Atem an, damit die OPs reagieren. Bitte vergessen Sie nicht den StackOverflow-Weg, um [Danke] (https://meta.stackexchange.com/a/5235) zu sagen! – Parfait

Verwandte Themen