Прочитайте несколько файлов CSV в отдельных кадрах данных
Предположим, у нас есть файлы file1.csv , file2.csv , … и file100.csv в каталоге C: \ R \ Data, и мы хотим прочитать их все в отдельных кадрах данных (например, file1 , file2 , … и file100 ).
Причина этого заключается в том, что, несмотря на наличие похожих имен, у них есть разные файловые структуры, поэтому не так полезно иметь их в списке.
Я мог бы использовать lapply
но он возвращает один список, содержащий 100 фреймов данных. Вместо этого я хочу, чтобы эти фреймы данных были в глобальной среде.
- Подмножество объекта xts по времени суток
- Количество столбцов по условию (>) для каждой строки
- Генерирование всех различных перестановок списка в R
- Удалить записи легенды для некоторых уровней факторов
- R Построение доверительных диапазонов с помощью ggplot
Как читать несколько файлов непосредственно в глобальной среде? Или, альтернативно, как мне распаковать содержимое списка фреймов данных?
- Отменить колонку кадра данных, сохраняя информацию из другого столбца
- Использовать переменную в выражении plotmath
- Сумма строк на основе значения столбца
- Изменение формата даты в R
- ggplot2: цвет полосы facet_wrap на основе переменной в наборе данных
- Как разбить данные на обучающие / тестовые наборы, используя функцию выборки
- Как изменить местоположение библиотеки в R?
- Наследование в R
Быстрый проект, непроверенный:
-
Используйте
list.files()
akadir()
для динамического создания списка файлов. -
Это возвращает вектор, просто пробегает вектор в цикле
for
. -
Прочтите i-й файл, затем используйте функцию
assign()
чтобы поместить содержимое в новую переменную file_i
Это должно сделать трюк для вас.
Спасибо всем за ответ.
Для полноты здесь мой окончательный ответ для загрузки любого количества (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")) }
Используйте assign
с символьной переменной, содержащей нужное имя вашего фрейма данных.
for(i in 1:100) { oname = paste("file", i, sep="") assign(oname, read.csv(paste(oname, ".txt", sep=""))) }
Не. Держите их как список. Это путь.
Вот способ распаковать список 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)))
Этот ответ предназначен как более полезное дополнение к ответу Хэдли.
В то время как 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
в вашей рабочей области, и часто это намного удобнее.
Простым способом доступа к элементам списка из глобальной среды является attach
списка. Обратите внимание, что это фактически создает новую среду в пути поиска и копирует в нее элементы вашего списка, поэтому вы можете удалить исходный список после прикрепления, чтобы предотвратить наличие двух потенциально разных копий.
Чтение всех 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=""))) }
#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)) }