Одним из решений является синтаксический анализ имен файлов и назначение их в качестве имен для элементов в списке фреймов данных.Мы будем использовать некоторые примеры данных с ежемесячными продажами пивных брендов за два года, которые были сохранены в виде файлов CSV в двух подкаталогах, year1
и year2
.
Мы будем использовать lapply()
для чтения файлов в списке фреймов данных, а затем используем функцию names()
для присвоения имен каждому элементу, добавляя year<x>.
к имени файла (исключая .csv
),
fileList <- c("year1/beer.csv","year2/beer.csv")
data <- lapply(fileList,function(x){
read.csv(x)
})
# generate data set names to be assigned to elements in the list
fileNameTokens <- strsplit(fileList,"/|[.]")
theNames <- unlist(lapply(fileNameTokens,function(x){
paste0(x[1],".",x[2])
}))
names(data) <- theNames
# print first six rows of file 1 based on named extract
data[["year1.beer"]][1:6,]
... и вывод.
> data[["year1.beer"]][1:6,]
Month Item Sales
1 1 Budweiser 83047
2 2 Budweiser 38374
3 3 Budweiser 47287
4 4 Budweiser 18417
5 5 Budweiser 23981
6 6 Budweiser 55471
>
Далее мы распечатаем первые несколько строк второго файла.
> # print first six rows of file 1 based on named extract
> data[["year2.beer"]][1:6,]
Month Item Sales
1 1 Budweiser 23847
2 2 Budweiser 33847
3 3 Budweiser 44400
4 4 Budweiser 35333
5 5 Budweiser 18710
6 6 Budweiser 63108
>
Если необходимо получить доступ к файлам напрямую, не полагаясь на имена list()
,они могут быть назначены родительской среде в функции lapply()
через функцию assign()
, как отмечено в другом ответе.
# alternate form, assigning directly to parent environment
data <- lapply(fileList,function(x){
# x is the filename, parse into strings to generate data set name
fileNameTokens <- unlist(strsplit(x,"/|[.]"))
assign(paste0(fileNameTokens[1],".",fileNameTokens[2]), read.csv(x),pos=1)
})
head(year1.beer)
... и вывод.
> head(year1.beer)
Month Item Sales
1 1 Budweiser 83047
2 2 Budweiser 38374
3 3 Budweiser 47287
4 4 Budweiser 18417
5 5 Budweiser 23981
6 6 Budweiser 55471
>
Эта техника также работает с RDS
файлами следующим образом.
data <- lapply(fileList,function(x){
# x is the filename, parse into strings to generate data set name
fileNameTokens <- unlist(strsplit(x,"/|[.]"))
assign(paste0(fileNameTokens[1],".",fileNameTokens[2]), readRDS(x),pos=1)
})
head(year1.beer)
... и с выводом.
> head(year1.beer)
Month Item Sales
1 1 Budweiser 83047
2 2 Budweiser 38374
3 3 Budweiser 47287
4 4 Budweiser 18417
5 5 Budweiser 23981
6 6 Budweiser 55471
>