2016-07-22 5 views
0

ich mehrere Dateien (30, Tab getrennt), die unten wie das aussehen:R - eine bestimmte Spalte aus mehreren Dateien schneiden und binden sie alltogether

|target_id | length| eff_length| est_counts| tpm| |:------------|------:|----------:|----------:|--------:| |LmjF.27.1250 | 966| 823.427| 2932| 94.7314| |LmjF.09.0430 | 1410| 1267.430| 3603| 75.6304| |LmjF.13.0210 | 2001| 1858.430| 4435| 63.4897| |LmjF.28.0530 | 4083| 3940.430| 7032| 47.4778| |LmjF.16.1400 | 591| 448.577| 1163| 68.9761| |LmjF.29.2570 | 1506| 1363.430| 11135| 217.2770|

Ich versuche, die fünfte Kolonne zu schneiden von allen dieser Dateien 30 Dateien mit einem Befehl wie:

fifth_colum_file1 = file1.csv[ , 5]

Aber ich will den Prozess automatisiert machen.

Die Dateien, die ich arbeiten wollen, müssen alle das Muster „bs_abundance“, deshalb denke ich, ein guter Ausgangspunkt sein würde entweder laden alle Dateien, die ich mit mit einem solchen Befehl arbeiten möchten:

temp = list.files(pattern="*bs_abundance")

Oder vielleicht kann ich auch alle Tabellen laden ich mit direkt in den Arbeitsraum arbeiten möchten schon:

for(i in temp) { x <- read.table(i, header=TRUE, comment.char = "A", sep="\t") assign(i,x)
}

Dann wird, wie erklärt, ich habe die fünfte c schneiden möchten olumn jeder Datei, um sie später an eine andere Tabelle mit der gleichen Anzahl von Zeilen zu binden.

Antwort

0

Hier ist eine Methode mit lapply, die davon ausgeht, dass jede Datei im Ordner die gleiche Anzahl von Zeilen hat.

# get file names 
files <- dir("temp") 
# remove one file 
files <- files[-which(files == "removeFileName")] 
# get list of vectors from 29 files 
myList <- lapply(files, function(i) {temp <- read.csv(i); temp[, 5]}) 
# get new data.frame 
dfDone <- do.call(data.frame, myList) 
+0

Ich habe alle Dateinamen mit' files <- list.files (pattern = "* bs_abundance") 'weil ich nicht Ich möchte alle Dateien, die sich in einem Ordner befinden, laden, stattdessen möchte ich sie anhand eines Musters laden (bs_abundance). Ich habe jetzt eine Datei mit den 29 Dateien, aus denen ich die fünfte Spalte extrahieren möchte Der Rest des Codes würde dann so aussehen? – BCArg

+0

Die dritte und vierte Zeile ('myList <- ...' und 'dfDone <-') sollten an dieser Stelle den Trick machen. – lmo

+0

Danke für die Antwort. Lassen Sie mich nur zwei Dinge klären. Muss ich den Pfad zu dem Ordner angeben, in dem sich meine Dateien in Zeile 2 befinden, wie 'files <- dir ("/path/to/my/files/")'? Und wenn ich das tue, was soll ich in die sechste Zeile schreiben, wo 'temp' geschrieben wird? – BCArg

1

Legen Sie die Dateien in einen Ordner. Für dieses Beispiel nennen wir es temp. Richten Sie Ihr Arbeitsverzeichnis entsprechend ein oder geben Sie den vollständigen Pfad für das folgende Beispiel an.

cols <- as.character() 
files <- dir("temp") 
for(i in files){ 
# You didn't mention a file type, but let's say it's csv 
tmp <- read.csv(files[i], header = T) 
tmp <- tmp[, 5] 
cols <- cbind(cols, tmp) 
} 

Dann können Sie einfach cbind die Spalten in cols mit Ihrem letzten Datenobjekt.

+0

Die Dateien sind Textdateien, tabulatorgetrennt. Ich lege alle Dateien, die ich öffnen wollte, in einen Ordner und lege den Pfad in die zweite Zeile 'files <- dir ("/path/to/my/files ")'. Ich denke, die ersten beiden Zeilen des Skripts funktionieren (nachdem ich die zweite Zeile getroffen habe, waren alle Dateien, die ich öffnen wollte, auf dem Vektor 'files'. Aber als ich versuchte, das Skript ab der dritten Zeile auszuführen, habe die Nachricht: 'Fehler in Datei (Datei," rt "): kann die Verbindung nicht öffnen Zusätzlich: Warnmeldung: In Datei (Datei," rt "): kann Datei 'NA' nicht öffnen: Keine solche Datei oder Verzeichnis ". – BCArg

+0

und davor habe ich das Arbeitsverzeichnis auf den Ordner gesetzt, in dem alle Dateien sind. – BCArg

Verwandte Themen