L oop через список идентификаторов для загрузки соответствующих файлов Excel? - PullRequest
0 голосов
/ 16 марта 2020

Я могу импортировать столбец уникальных идентификаторов в R как объект. Существует файл Excel с соответствующим именем для каждого идентификатора (около 500). Я пытаюсь записать все oop в go через все эти уникальные идентификаторы и загрузить соответствующий файл Excel.

Я попытался:

for (i in 1:nrow(pi)){
read_excel()
}

Обновление: просто уточнить, потому что я не думаю, что предоставил адекватные примеры.

У меня есть столбец Excel, который состоит из около 500 уникальных идентификаторов, каждый из которых представляет собой последовательность из 11 чисел или около того. Для каждого идентификатора у меня есть файл Excel с соответствующим именем. Все файлы Excel находятся в одной папке. Для каждого уникального идентификатора я хотел бы открыть файл с соответствующим именем и получить указанные c ячейки, ie нижнее и верхнее значения в определенном столбце, максимальное значение или среднее значение другого столбца и т. Д. c.

Где «пи» - это объект, который должен быть вектором уникальных идентификаторов. Я не уверен, как это сделать. Альтернативные методы решения этой проблемы приветствуются. На самом деле, я просто пытаюсь получить указанные c значения из Excel, ie первое и последнее значения в определенном столбце, максимум и среднее значение другого столбца et c.

1 Ответ

1 голос
/ 16 марта 2020

Поскольку в исходном посте не было данных, я проиллюстрирую один метод, в котором мы используем вектор чисел идентификаторов для генерации имен файлов для чтения нескольких таблиц, связанных с 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"
>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...