Как скачать все листы в гугл листе в R - PullRequest
1 голос
/ 25 апреля 2020

Я хочу загрузить все листы на одном листе Google в R. В настоящее время я использую пакет gsheet по [maxconway][1], который позволяет мне загружать лист по его URL-адресу, но только работает на отдельных листах, которые различаются на gid. Набор листов Google, которые я пытаюсь загрузить, содержит более 100 листов, что делает их загрузку один за другим с gsheet, что крайне неудобно - кто-нибудь знает о каких-либо пакетах R, которые автоматизируют этот или любой другой способ получения l oop через все листы в одном гугл листе?
Вот код, который у меня сейчас есть, который загружает только первый из более чем 100 листов в виде таблицы:

all_rolls <- gsheet2tbl('https://docs.google.com/spreadsheets/d/1OEg29XbL_YpO0m5JrLQpOPYTnxVsIg8iP67EYUrtRJg/edit#gid=26346344')

> head(all_rolls)
# A tibble: 6 x 14
  Episode Time   Character `Type of Roll` `Total Value` `Natural Value` `Crit?` `Damage Dealt` `# Kills`
    <int> <drtn> <chr>     <chr>          <chr>         <chr>           <chr>   <chr>              <int>
1       1 37'53" Vex'ahlia Intelligence   20            18              <NA>    <NA>                  NA
2       1 41'48" Grog      Persuasion     19            18              <NA>    <NA>                  NA
3       1 43'25" Keyleth   Persuasion     2             2               <NA>    <NA>                  NA
4       1 46'35" Tiberius  Persuasion     12            3               <NA>    <NA>                  NA
5       1 46'35" Tiberius  Persuasion     27            18              <NA>    <NA>                  NA
6       1 46'35" Percy     Assist         21            15              <NA>    <NA>                  NA
# … with 5 more variables: Notes <chr>, `Non-Roll Kills` <chr>, X12 <chr>, X13 <chr>, X14 <chr>

Примечание. Я попытался удалить поле #gid, но затем он просто загружает первый лист.

1 Ответ

1 голос
/ 25 апреля 2020

Пакет googlesheets4 включает функцию для вывода списка всех листов, связанных с Google Диском учетной записи: sheets_find(). Из списка листов можно использовать идентификаторы листов для считывания листов в R.

library(googlesheets4)
sheets_auth()
theSheets <- sheets_find()
theSheets

В моем тестовом аккаунте в Google есть один лист Google, электронная таблица со статистикой покемонов.

> theSheets
# A tibble: 1 x 3
  name         id                                           drive_resource   
* <chr>        <chr>                                        <list>           
1 PokemonStats 13rGxY7ScDUl7bFJ9NipO7QUafEACYTH4MagFjcj4pVw <named list [34]>

Мы можем использовать поле ID для загрузки листа.

pokemonData <- sheets_read(theSheets$id[1])
head(pokemonData)


> head(pokemonData)
# A tibble: 6 x 13
  Number Name  Type1 Type2 Total    HP Attack Defense SpecialAtk SpecialDef Speed
   <dbl> <chr> <chr> <chr> <dbl> <dbl>  <dbl>   <dbl>      <dbl>      <dbl> <dbl>
1      1 Bulb… Grass Pois…   318    45     49      49         65         65    45
2      2 Ivys… Grass Pois…   405    60     62      63         80         80    60
3      3 Venu… Grass Pois…   525    80     82      83        100        100    80
4      3 Venu… Grass Pois…   625    80    100     123        122        120    80
5      4 Char… Fire  NA      309    39     52      43         60         50    65
6      5 Char… Fire  NA      405    58     64      58         80         65    80
# … with 2 more variables: Generation <dbl>, Legendary <lgl>
> 

Можно использовать вектор theSheets$id с lapply() для чтения группы листов с Google Диска следующим образом:

sheetList <- lapply(theSheets$id,sheet_read)

Для чтения нескольких рабочих листов в Google Sheets В электронную таблицу мы добавляем аргумент sheet= к sheet_read(). Здесь мы читаем «Типы покемонов» со второй таблицы в таблице «Статистика покемонов».

pokemonTypes <- sheets_read(theSheets$id[1],sheet = 2)
head(pokemonTypes)

... и вывод:

> head(pokemonTypes)
# A tibble: 6 x 1
  Type    
  <chr>   
1 Fire    
2 Grass   
3 Poison  
4 Water   
5 Bug     
6 Fighting
> 

Чтение всех таблиц в электронной таблице

Мы можем автоматизировать процесс чтения нескольких вкладок из одной электронной таблицы , Функция sheets_sheets() полезна для этой цели.

# technique where we read multiple worksheets by worksheet name
theSheets <- sheets_find()
# get metadata from first sheet
sheetMetadata <- sheets_get(theSheets$id[1])
# get worksheet tab names
sheetNames <- sheets_sheets(theSheets$id[1])
sheetNames

На данный момент мы видим, что есть две вкладки рабочего листа в электронной таблице Покемонов. Мы используем вектор sheetNames с lapply(), чтобы прочитать все рабочие листы в основной электронной таблице.

theWorksheets <- lapply(sheetNames, function(x){             
     sheets_read(theSheets$id[1],sheet = x) 
})
# use the `names()` function to name the data frames stored in the list
names(theWorksheets) <- sheetNames
lapply(theWorksheets,head)

... и вывод:

> lapply(theWorksheets,head)
$Pokemon
# A tibble: 6 x 13
  Number Name  Type1 Type2 Total    HP Attack Defense SpecialAtk SpecialDef Speed
   <dbl> <chr> <chr> <chr> <dbl> <dbl>  <dbl>   <dbl>      <dbl>      <dbl> <dbl>
1      1 Bulb… Grass Pois…   318    45     49      49         65         65    45
2      2 Ivys… Grass Pois…   405    60     62      63         80         80    60
3      3 Venu… Grass Pois…   525    80     82      83        100        100    80
4      3 Venu… Grass Pois…   625    80    100     123        122        120    80
5      4 Char… Fire  NA      309    39     52      43         60         50    65
6      5 Char… Fire  NA      405    58     64      58         80         65    80
# … with 2 more variables: Generation <dbl>, Legendary <lgl>

$Metadata
# A tibble: 6 x 1
  Type    
  <chr>   
1 Fire    
2 Grass   
3 Poison  
4 Water   
5 Bug     
6 Fighting

> 

На этом этапе к отдельным рабочим листам можно получить доступ с помощью формы $ оператора извлечения, например theWorksheets$Pokemon или theWorksheets$Metadata.

...