Поскольку в исходном посте не было данных, я проиллюстрирую один метод, в котором мы используем вектор чисел идентификаторов для генерации имен файлов для чтения нескольких таблиц, связанных с Basi c Статистика покемонов для поколений 1 - 7 покемонов.
Чтобы сделать пример полностью воспроизводимым, я храню zip-файл с этими данными на GitHub, который мы можем загрузить и загрузить в R.
Мы будем использовать функцию sprintf()
для создания файла имена, потому что sprintf()
позволяет нам не только добавлять информацию каталога, необходимую для определения местоположения файлов, а также форматировать числа с ведущими нулями, которые необходимы для генерации правильных имен файлов.
Вместо for()
l oop мы будем использовать lapply()
вместе с анонимной функцией для создания имен файлов и чтения их как файлов Excel с readxl::read_excel()
.
download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/PokemonXLSX.zip",
"PokemonXLSX.zip",
method="curl",mode="wb")
unzip("PokemonXLSX.zip")
library(readxl)
# create a set of numbers to be used to generate
generationIds <- 1:7
spreadsheets <- lapply(generationIds,function(x) {
# use generation number to create individual file name
aFile <- sprintf("./PokemonData/gen%02i.xlsx",x)
data <- read_excel(aFile)
})
На этом этапе объект spreadsheets
представляет собой список из семи элементов, один из которых соответствует каждому поколению покемонов (т. Е. Один элемент на электронную таблицу).
Мы можем объединить семь файлов с rbind()
, а затем распечатать последние несколько строк результирующего фрейма данных.
pokemon <- do.call(rbind,spreadsheets)
tail(pokemon)
... и результат:
> pokemon <- do.call(rbind,spreadsheets)
> tail(pokemon)
# A tibble: 6 x 13
Number Name Type1 Type2 Total HP Attack Defense SpecialAtk SpecialDef
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 802 Mars… Figh… Ghost 600 90 125 80 90 90
2 803 Poip… Pois… NA 420 67 73 67 73 67
3 804 Naga… Pois… Drag… 540 73 73 73 127 73
4 805 Stak… Rock Steel 570 61 131 211 53 101
5 806 Blac… Fire Ghost 570 53 127 53 151 79
6 807 Zena… Elec… NA 600 88 112 75 102 80
# … with 3 more variables: Speed <dbl>, Generation <dbl>, Legendary <lgl>
>
Spotlight: доступ к файлам с диска
Приведенная выше методика использует несколько ограничений, встроенных в файл PokemonXLSX.zip, и способ загрузки.
Во-первых, zip-файл содержит подкаталог PokemonData
. Во-вторых, функция download.file()
загружает zip-файл в текущий рабочий каталог R.
Следовательно, функция unzip()
создает подкаталог, PokemonData
, как дочерний элемент рабочего каталога R. Мы можем получить доступ к файлам в этом подкаталоге, добавив ./PokemonData/
к их именам. .
в этом синтаксисе ссылается на текущий каталог.
Мы можем проиллюстрировать, как создаются имена файлов, с помощью следующего кода.
theFiles <- lapply(generationIds,function(x) {
# use generation number to create individual file name
aFile <- sprintf("./PokemonData/gen%02i.xlsx",x)
message(paste("current file is: ",aFile))
aFile
})
... и вывод:
> theFiles <- lapply(generationIds,function(x) {
+ # use generation number to create individual file name
+ aFile <- sprintf("./PokemonData/gen%02i.xlsx",x)
+ message(paste("current file is: ",aFile))
+ aFile
+ })
current file is: ./PokemonData/gen01.xlsx
current file is: ./PokemonData/gen02.xlsx
current file is: ./PokemonData/gen03.xlsx
current file is: ./PokemonData/gen04.xlsx
current file is: ./PokemonData/gen05.xlsx
current file is: ./PokemonData/gen06.xlsx
current file is: ./PokemonData/gen07.xlsx
>
Можно идентифицировать рабочий каталог R изнутри RStudio с помощью функции getwd()
. На моем MacBook Pro я получаю следующий результат.
> getwd()
[1] "/Users/lgreski/gitrepos/datascience"
>