Bearbeiten Sie mehrere Dateien in R
Ich bin neu in R und bin auf der Suche nach einem code zu manipulieren, um Hunderte von Dateien, die ich in der hand. Sie sind .txt-Dateien mit ein paar Zeilen von unerwünschten text, gefolgt von Spalten von Daten, suchen so etwas wie dieses:
XXXXX
XXXXX
XXXXX
Col1 Col2 Col3 Col4 Col5
1 36 37 35 36
2 34 34 36 37
.
.
1500 34 35 36 35
Schrieb ich einen code (unten) extrahieren Sie ausgewählte Zeilen in die Spalten 1 und 5 von einer Person .txt-Datei, und würde gerne eine Schleife für alle Dateien, die ich habe.
data <- read.table(paste("/Users/tan/Desktop/test/01.txt"), skip =264, nrows = 932)
selcol<-c("V1", "V5")
write.table(data[selcol], file="/Users/tan/Desktop/test/01ed.txt", sep="\t")
Mit dem obigen code, die .txt-Datei sieht nun wie folgt aus:
Col1 Col5
300 34
.
.
700 34
Wenn möglich, würde ich gerne kombinieren, alle Col5 der .txt-Dateien mit einem von Spalte 1 (das ist das gleiche für alle txt-Dateien), so dass es wie folgt aussieht:
Col1 Col5a Col5b Col5c Col5d ...
300 34 34 36 37
.
.
700 34 34 36 37
Danke!
Tan
- willkommen auf der Website! Der stack-overflow-Website verwendet den {} - Taste, um format-code oder das Einrücken mit vier Leerzeichen. Ich ging durch und versuchte format der code, der die Art, wie ich denke, es sollte auf den </p> - tags, die Sie dort hatten. Sie können es wieder ändern, wenn ich etwas Durcheinander.
- Super Arbeit!!! es sieht viel klarer jetzt... ich danke Euch so sehr, Chase! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay - ich denke ich trifft auf alle deine Fragen hier, aber lassen Sie mich wissen, wenn ich etwas verpasst. Der Allgemeine Prozess, den wir Durchlaufen hier:
lapply
Durchlaufen jede dieser Datei-Namen zum erstellen einer einzelnen Liste-Objekt, das enthält alle Daten,Für die Zwecke der Beispiel betrachten Sie ich habe vier Dateien namens
file1.txt
durchfile4.txt
, die alle wie folgt Aussehen:Ergebnisse im folgenden:
read.table(....)
Anrufe, fügen Sie einfach in Ihre Argumenteskip = 264, nrows = 932
. Zum Beispiel, wo erfunction(x) read.table(x, header = TRUE)
ändern Sie es zufunction(x) read.table(x, header = TRUE, skip = 264, nrows = 932)
aber tun, stellen Sie sicher, dass alle Dateien 932 Zeilen. Wenn die nicht und nach nicht-Daten-Zeilen, der rest der Datei besteht aus Daten, nur lassen Sie dienrow = 932
bit.merge()
Schritt und Lesen Sie einfach die Spalte, die wir wollen, und dann einen extra Lesen für die doppelte Spalte? Wir könnensapply()
Rückkehr der matrix der Spalten wollte, anstatt lassen Sie als eine Liste mitlapply()
. So etwas wie:cbind(read.table(filesToProcess[1], header = TRUE)[,1], sapply(filesToProcess, function(x) read.table(x, header = TRUE)[,3]))
(Sorry, dass wrap furchtbar.) Und dann reinigen Sie die Spalte Namen?do.call()
- und merge, aber das hat nicht funktioniert wie geplant, so landete ich mitReduce()
.cbind()
undsapply()
sind sicherlich weniger esoterisch alsReduce()
zu. Danke für den Tipp.colClasses
imread.table
. Eine Sache, die möglicherweise schief gehen mit Ihrem Verfahren haben Sie unterschiedliche Anzahl von Zeilen zu überspringen / zu Lesen, in dem FallreadLines
+grep
besser geeignet sein können. Ein letzter Tipp; mit der reshape Paket können Sie leichtmelt
die Ausgabe vonlapply
und erhalten eine lang-format-Daten.Rahmen mit all Ihren Beobachtungen tagged with variableL1
bezogen auf die ursprüngliche Datei.listOfFiles <- lapply(listOfFiles, function(z) z[c("x", "y2")])
, wo eine Fehlermeldung zurück:Error in [.data.frame(z, c("x", "y2")) : undefined columns selected
Was kann ich tun, um dieses Problem beheben? Danke!!!header=TRUE
es funktioniert gut, wahrscheinlich wegen der vorangehenden Zeilen text, bevor die Tabelle beginnt für jede Datei. Ich bin jetzt ratlos anout <- Reduce(function(x,y) {merge(x,y, by = "x")}, listOfFiles)
- Fehlermeldung:Error in fix.by(by.x, x) : 'by' must specify valid column(s)
undcolnames(out) <- c("x", sub("\\.txt", "", filesToProcess))
- Fehlermeldung:Error in
colnames<-(
*tmp*, value = c("x", "00.jaz", "01.jaz", "02.jaz", : attempt to set colnames on object with less than two dimensions