Odczyt wielu plików CSV do oddzielnych ramek danych

Załóżmy, że mamy Pliki plik1.csv, file2.csv ,... i plik100.csv w katalogu C:\R\Data i chcemy je wszystkie wczytać do osobnych ramek danych (np. file1, file2 ,... , oraz file100 ).

Powodem tego jest to, że pomimo podobnych nazw mają one różne struktury plików, więc nie jest to zbyt przydatne, aby mieć je na liście.

I could use lapply but that returns a single list containing 100 ramki danych. Zamiast tego chcę te ramki danych w środowisku globalnym.

Jak odczytać wiele plików bezpośrednio w środowisku globalnym? Lub, alternatywnie, jak rozpakować do niego zawartość listy ramek danych?

Author: Joshua Ulrich, 2011-03-16

9 answers

Quick draft, untested:

  1. Użyj list.files() aka dir() do dynamicznego generowania listy plików.

  2. Zwraca wektor, po prostu biegnie wzdłuż wektora w pętli for.

  3. Odczytaj i-ten plik, a następnie użyj assign(), aby umieścić zawartość w nowej zmiennej file_i

To powinno wystarczyć.
 23
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 01:00:41

Dziękuję wszystkim za odpowiedź.

Dla kompletności oto moja ostateczna odpowiedź na załadowanie dowolnej liczby (tabulator) rozdzielonych plików, w tym przypadku z 6 kolumnami danych każda, gdzie kolumna 1 to znaki, 2 to współczynnik, a pozostała liczba:

##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"))
}
 21
Author: Fred,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 20:13:55

Użyj assign ze zmienną znakową zawierającą żądaną nazwę ramki danych.

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
 14
Author: Hong Ooi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 01:02:56

Nie, zachowaj je jako listę. Taka jest droga.

 12
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 03:13:40

Oto sposób na rozpakowanie listy danych.frames using just lapply

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
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 20:55:07

Ta odpowiedź ma być bardziej użytecznym uzupełnieniem odpowiedzi Hadleya.

Podczas gdy OP specjalnie chciał, aby każdy plik był wczytywany do ich przestrzeni roboczej R jako osobny obiekt, wiele innych osób naiwnie lądujących na tym pytaniu może myśleć , że właśnie to chcą zrobić, podczas gdy w rzeczywistości lepiej byłoby odczytać pliki w jednej liście ramek danych.

Tak dla jasności, oto jak możesz to zrobić.
#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)

Teraz każdy z plików może być o którym mowa przez my_files[["filename"]], co naprawdę nie jest dużo gorsze , że po prostu posiadanie oddzielnych zmiennych filename w przestrzeni roboczej, a często jest to o wiele wygodniejsze.

 6
Author: joran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-27 07:33:33

Prosty sposób dostępu do elementów listy ze środowiska globalnego to attach lista. Zauważ, że w rzeczywistości tworzy to nowe środowisko na ścieżce wyszukiwania i kopiuje do niego elementy listy, więc możesz chcieć usunąć oryginalną listę po dołączeniu, aby zapobiec dwóm potencjalnie różnym kopiom unoszącym się wokół.

 2
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 14:31:56

Odczytanie wszystkich plików CSV z folderu i utworzenie pustaków takich samych jak nazwy plików:

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
Author: Manoj Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-05 06:59:51
#copy all the files you want to read in R in your working directory
a <- dir()
#using lapply to remove the".csv" from the filename 
for(i in a){
list1 <- lapply(a, function(x) gsub(".csv","",x))
}
#Final step 
for(i in list1){
filepath <- file.path("../Data/original_data/..",paste(i,".csv",sep=""))
assign(i, read.csv(filepath))
}
 -2
Author: Parikshit Sohoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-25 07:06:20