wake-up-neo.net

Lesen Sie mehrere CSV-Dateien in separate Datenrahmen

Angenommen, wir haben Dateien file1.csv , file2.csv , ... und file100.csv im Verzeichnis C:\R\Data , und wir möchten sie lesen alle in separate Datenrahmen (z. B. Datei1 , Datei2 , ... und Datei100 ). 

Der Grund dafür ist, dass sie trotz ähnlicher Namen unterschiedliche Dateistrukturen haben. Daher ist es nicht so nützlich, sie in einer Liste zu haben.

Ich könnte lapply verwenden, aber das gibt eine einzelne Liste mit 100 Datenrahmen zurück. Stattdessen möchte ich diese Datenrahmen in der globalen Umgebung.

Wie lese ich mehrere Dateien direkt in die globale Umgebung? Oder wie entpacke ich alternativ den Inhalt einer Liste von Datenrahmen? 

28
Fred

Schneller Entwurf, nicht getestet:

  1. Verwenden Sie list.files() aka dir(), um Ihre Liste der Dateien dynamisch zu generieren. 

  2. Dies gibt einen Vektor zurück, der nur in einer for-Schleife am Vektor entlang läuft.

  3. Lesen Sie die i-te Datei und fügen Sie den Inhalt mit assign() in eine neue Variable file_i ein

Das sollte den Trick für Sie tun.

24

Vielen Dank für Ihre Antwort. 

Der Vollständigkeit halber hier meine endgültige Antwort für das Laden einer beliebigen Anzahl von (Tabulator-) getrennten Dateien, in diesem Fall mit jeweils 6 Datenspalten, wobei Spalte 1 Zeichen ist, 2 Faktor ist und Restzahl:

##Read files named xyz1111.csv, xyz2222.csv, etc.
filenames <- list.files(path="../Data/original_data",
    pattern="xyz+.*csv")

##Create list of data frame names without the ".csv" part 
names <-substr(filenames,1,7))

###Load all files
for(i in names){
    filepath <- file.path("../Data/original_data/",paste(i,".csv",sep=""))
    assign(i, read.delim(filepath,
    colClasses=c("character","factor",rep("numeric",4)),
    sep = "\t"))
}
24
Fred

Verwenden Sie assign mit einer Zeichenvariablen, die den gewünschten Namen Ihres Datenrahmens enthält.

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
14
Hong Ooi

Nicht Behalten Sie sie als Liste. Es ist der Weg zu gehen.

12
hadley

Diese Antwort ist als nützlichere Ergänzung zu Hadleys Antwort gedacht.

Während das OP speziell wollte, dass jede Datei als separates Objekt in ihren R-Arbeitsbereich eingelesen wird, können viele andere Personen, die naiv auf dieser Frage landen, Denke , dass sie das tun wollen, obwohl sie die Dateien besser in eine einzelne Liste von Datenrahmen einlesen sollten.

Also fürs Protokoll, hier ist, wie Sie das tun könnten.

#If the path is different than your working directory
# you'll need to set full.names = TRUE to get the full
# paths.
my_files <- list.files("path/to/files")

#Further arguments to read.csv can be passed in ...
all_csv <- lapply(my_files,read.csv,...)

#Set the name of each list element to its
# respective file name. Note full.names = FALSE to
# get only the file names, not the full path.
names(all_csv) <- gsub(".csv","",
                       list.files("path/to/files",full.names = FALSE),
                       fixed = TRUE)

Jetzt kann auf jede der Dateien durch my_files[["filename"]] Verwiesen werden, was wirklich nicht viel schlimmer ist, als wenn nur filename Variablen in Ihrem Arbeitsbereich, und oft ist es viel bequemer.

7
joran

Hier ist eine Möglichkeit, eine Liste von data.frames mit Hilfe von lapply zu entpacken

filenames <- list.files(path="../Data/original_data",
                        pattern="xyz+.*csv")

filelist <- lappy(filenames, read.csv)

#if necessary, assign names to data.frames
names(filelist) <- c("one","two","three")

#note the invisible function keeps lapply from spitting out the data.frames to the console

invisible(lapply(names(filelist), function(x) assign(x,filelist[[x]],envir=.GlobalEnv)))
6
Robert

Eine einfache Möglichkeit, auf die Elemente einer Liste in der globalen Umgebung zuzugreifen, ist attach der Liste. Beachten Sie, dass dadurch tatsächlich eine neue Umgebung im Suchpfad erstellt wird und die Elemente Ihrer Liste in den Pfad kopiert werden. Möglicherweise möchten Sie die ursprüngliche Liste nach dem Anhängen entfernen, um zu verhindern, dass zwei möglicherweise unterschiedliche Kopien herumliegen.

2
Aaron

Lesen Sie alle CSV-Dateien aus einem Ordner und erstellen Sie die gleichen Faktoren wie die Dateinamen:

setwd("your path to folder where CSVs are")

filenames <- gsub("\\.csv$","", list.files(pattern="\\.csv$"))

for(i in filenames){
  assign(i, read.csv(paste(i, ".csv", sep="")))
}
0
Manoj Kumar