Прочитайте несколько файлов CSV в отдельных кадрах данных
Предположим, что у нас есть файлы file1.csv, file2.csv,... и file100.csv в каталоге C:\R\Data, и мы хотим прочитать их все в отдельных кадрах данных (например, file1, file2,..., и file100).
Причиной этого является то, что, несмотря на наличие похожих имен, у них есть разные файловые структуры, поэтому не так полезно иметь их в списке.
Я мог бы использовать lapply
, но возвращает единственный список, содержащий 100 фреймов данных. Вместо этого я хочу, чтобы эти фреймы данных в глобальной среде.
Как я могу прочитать несколько файлов непосредственно в глобальной среде? Или, альтернативно, как мне распаковать содержимое списка фреймов данных?
Ответы
Ответ 1
Быстрый проект, непроверенный:
-
Используйте list.files()
aka dir()
для динамического создания списка файлов.
-
Возвращает вектор, просто пробегает вектор в цикле for
.
-
Прочитайте i-й файл, затем используйте assign()
, чтобы поместить содержимое в новую переменную file_i
Это должно сделать трюк для вас.
Ответ 2
Спасибо всем за ответ.
Для полноты здесь представлен мой окончательный ответ для загрузки любого количества файлов с разделителями (tab), в этом случае с 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"))
}
Ответ 3
Используйте assign
с символьной переменной, содержащей нужное имя вашего фрейма данных.
for(i in 1:100)
{
oname = paste("file", i, sep="")
assign(oname, read.csv(paste(oname, ".txt", sep="")))
}
Ответ 4
не делать. Держите их как список. Это путь.
Ответ 5
Вот способ распаковать список 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)))
Ответ 6
Этот ответ предназначен как более полезное дополнение к ответу Хэдли.
В то время как OP специально хотел, чтобы каждый файл считывался в свое рабочее пространство 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
Простым способом доступа к элементам списка из глобальной среды является attach
список. Обратите внимание: это фактически создает новую среду в пути поиска и копирует в нее элементы вашего списка, поэтому вы можете удалить исходный список после прикрепления, чтобы не плавать вокруг двух потенциально разных копий.
Ответ 8
Чтение всех файлов CSV из папки и создание ватронов аналогично именам файлов:
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="")))
}
Ответ 9
#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))
}