Вот полностью воспроизводимый пример, основанный на данных Pokémon Stats . Вместо того, чтобы просто записывать входные файлы в list()
, я использую assign()
для имитации набора фреймов данных в глобальной среде.
download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/pokemonData.zip",
"pokemonData.zip",
method="curl",mode="wb")
unzip("pokemonData.zip")
thePokemonFiles <- list.files("./pokemonData",
full.names=TRUE)
filenames <- substr(list.files("./pokemonData",full.names = FALSE),1,5)
results <- lapply(1:length(thePokemonFiles),function(x) {
# read data and assign to a name in global environment
data <- read.csv(thePokemonFiles[x],stringsAsFactor = FALSE)
assign(filenames[x],data,globalenv())
return(TRUE)
})
На данный момент у нас есть 7 фреймов данных с именами от gen01
до gen07
в глобальной среде.
Далее мы генерируем желаемый порядок сортировки как вектор. Мы будем использовать это вместе с именами из вектора filenames
, чтобы получить данные и построить список вывода в желаемом порядке сортировки фреймов данных.
desiredSortOrder <- c(1,3,5,7,2,4,6)
sortedDataFrames <- lapply(desiredSortOrder,function(x){
get(filenames[x])
})
# verify generation numbers by printing first row of each data frame
lapply(sortedDataFrames,function(x){
x[1,c(1,2,12)]
})
Поскольку столбец Generation
в каждом фрейме данных соответствует связанному имени файла, мы можем проверить порядок сортировки, напечатав первую строку каждого фрейма данных.
>lapply(sortedDataFrames,function(x){
+ x[1,c(1,2,12)]
+ })
[[1]]
Number Name Generation
1 1 Bulbasaur 1
[[2]]
Number Name Generation
1 252 Treecko 3
[[3]]
Number Name Generation
1 494 Victini 5
[[4]]
Number Name Generation
1 722 Rowlet 7
[[5]]
Number Name Generation
1 152 Chikorita 2
[[6]]
Number Name Generation
1 387 Turtwig 4
[[7]]
Number Name Generation
1 650 Chespin 6
>