Читать несколько файлов CSV в отдельных фреймах данных - PullRequest
28 голосов
/ 16 марта 2011

Предположим, у нас есть файлы file1.csv , file2.csv , ... и file100.csv в каталоге C: \ R\ Data и мы хотим прочитать их все в отдельных фреймах данных (например, file1 , file2 , ... и file100 ).

Причина этого в том, что, несмотря на одинаковые имена, они имеют разные файловые структуры, поэтому не очень полезно иметь их в списке.

Я мог бы использовать lapply, но этовозвращает один список, содержащий 100 кадров данных.Вместо этого я хочу, чтобы эти фреймы данных в глобальной среде.

Как я могу прочитать несколько файлов непосредственно в глобальной среде?Или, альтернативно, как мне распаковать содержимое списка фреймов данных в него?

Ответы [ 9 ]

24 голосов
/ 16 марта 2011

Спасибо всем за ответ.

Для полноты приведу мой окончательный ответ для загрузки любого количества файлов с разделителями (табуляцией), в данном случае с 6 столбцами данных, в каждом из которых столбец 1 - это символы, 2 - это коэффициент, а остаток числовой:

##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 голосов
/ 16 марта 2011

Быстрый черновик, не проверено:

  1. Используйте list.files() aka dir() для динамического создания списка файлов.

  2. Возвращает вектор, просто бегите вдоль вектора в цикле for.

  3. Считайте i-й файл, затем используйте assign(), чтобы поместить содержимое в новую переменную file_i

Это должно помочь тебе.

14 голосов
/ 16 марта 2011

Используйте assign с символьной переменной, содержащей желаемое имя вашего фрейма данных.

for(i in 1:100)
{
   oname = paste("file", i, sep="")
   assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
13 голосов
/ 16 марта 2011

Не.Храните их как список.Это путь.

7 голосов
/ 06 марта 2015

Этот ответ является более полезным дополнением к ответу Хэдли.

Хотя ОП специально хотел, чтобы каждый файл считывался в их рабочее пространство R как отдельный объект, многие другие люди наивно приземляются.по этому вопросу может подумать , что именно это они и хотят сделать, когда на самом деле им будет лучше читать файлы в единый список фреймов данных.

Итак, для записи,вот как вы можете это сделать.

#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)

Теперь любой из файлов может быть указан как my_files[["filename"]], что на самом деле не намного хуже , что просто с отдельным filenameпеременные в вашем рабочем пространстве, и часто это гораздо удобнее.

7 голосов
/ 30 июня 2013

Вот способ распаковать список data.frames, используя только 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)))
2 голосов
/ 16 марта 2011

Простой способ получить доступ к элементам списка из глобальной среды - attach список. Обратите внимание, что это фактически создает новую среду в пути поиска и копирует в нее элементы вашего списка, поэтому вы можете захотеть удалить исходный список после присоединения, чтобы избежать появления двух потенциально разных копий.

0 голосов
/ 05 апреля 2017

Чтение всех CSV-файлов из папки и создание vactors, совпадающих с именами файлов:

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 голосов
/ 24 октября 2016
#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))
}
...