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?
9 answers
Quick draft, untested:
Użyj
list.files()
akadir()
do dynamicznego generowania listy plików.Zwraca wektor, po prostu biegnie wzdłuż wektora w pętli
for
.-
Odczytaj i-ten plik, a następnie użyj
assign()
, aby umieścić zawartość w nowej zmiennej file_i
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"))
}
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="")))
}
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.
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)))
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.
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ół.
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="")))
}
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))
}
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