Π Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° Π²Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ β€” ΡΠΏΠΈΡΡŠΡ†ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R (ΠΏΠ°ΠΊΠ΅Ρ‚Π° tidyr ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ сСмСйството unnest)

Π’ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ ΠΎΡ‚ API ΠΈΠ»ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈ Π΄Π°Π½Π½ΠΈ с слоТна Π΄ΡŠΡ€Π²ΠΎΠ²ΠΈΠ΄Π½Π° структура, Ρ‰Π΅ сС ΡΠ±Π»ΡŠΡΠΊΠ°Ρ‚Π΅ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ JSON ΠΈ XML.

Π’Π΅Π·ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ ΠΈΠΌΠ°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ прСдимства: Ρ‚Π΅ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π΄Π°Π½Π½ΠΈ сравнитСлно ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ ΠΈ позволяват Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π΅ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΎΡ‚ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€Π°Π½Π΅ Π½Π° информация.

ΠΠ΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ Π½Π° Ρ‚Π΅Π·ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ Π΅ слоТността ΠΈΠΌ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ·. НСструктуриранитС Π΄Π°Π½Π½ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² изчислСния ΠΈ Π½Π΅ Π΅ възмоТно Π΄Π° сС изградят Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° тяхна Π±Π°Π·Π°.

Π Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° Π²Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ β€” ΡΠΏΠΈΡΡŠΡ†ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R (ΠΏΠ°ΠΊΠ΅Ρ‚Π° tidyr ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ сСмСйството unnest)

Π’Π°Π·ΠΈ статия Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° публикацията "R ΠΏΠ°ΠΊΠ΅Ρ‚ tidyr ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pivot_longer ΠΈ pivot_wider". Вя Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ‚Π΅ нСструктуриранитС конструкции Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΏΠΎΠ·Π½Π°Ρ‚, ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° Π°Π½Π°Π»ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ‡Π΅Π½ Π²ΠΈΠ΄ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° tidyr, входящ Π² основата Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° tidyverse, ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΠΎΡ‚ сСмСйството unnest_*().

Π‘ΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅

Ако сС интСрСсуватС ΠΎΡ‚ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π²ΠΈ Π±ΡŠΠ΄Π°Ρ‚ интСрСсни ΠΌΠΎΠΈΡ‚Π΅ telegram ΠΈ youtube ΠΊΠ°Π½Π°Π»ΠΈ. Голямата част ΠΎΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠΌ Π΅ посвСтСна Π½Π° Π΅Π·ΠΈΠΊΠ° R.

  1. Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
  2. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π½Π° GitHub
  3. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Github
  4. ΠŸΠ΅Ρ€ΡΠΎΠ½Π°ΠΆΠΈ Π½Π° Π˜Π³Ρ€Π° Π½Π° Ρ‚Ρ€ΠΎΠ½ΠΎΠ²Π΅
  5. Π“Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Google
  6. Дискография Π½Π° Π¨Π°Ρ€Π»Π° Π“Π΅Π»Ρ„Π°Π½Π΄
  7. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

Rectangling (ΠΏΡ€ΠΈΠΌ. Π½Π° ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡Π°, Π½Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… Π°Π΄Π΅ΠΊΠ²Π°Ρ‚Π½ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ Π·Π° ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° Ρ‚ΠΎΠ·ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, Π·Π°Ρ‚ΠΎΠ²Π° Π³ΠΎ оставямС ΠΊΠ°ΠΊΡ‚ΠΎ Π΅.) β€” Ρ‚ΠΎΠ²Π° Π΅ процСс Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° нСструктурирани Π΄Π°Π½Π½ΠΈ с Π²Π»ΠΎΠΆΠ΅Π½ΠΈ масиви Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΡΡŠΡΡ‚ΠΎΡΡ‰Π° сС ΠΎΡ‚ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΡ‚Π΅ Π½ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ. Π’ tidyr ΠΈΠΌΠ° няколко Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° Ρ€Π°Π·ΡˆΠΈΡ€ΠΈΡ‚Π΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ-ΡΠΏΠΈΡΡŠΡ†ΠΈ ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² ΠΏΡ€Π°Π²ΠΎΡŠΠ³ΡŠΠ»Π½Π°, Ρ‚Π°Π±Π»ΠΈΡ‡Π½Π° Ρ„ΠΎΡ€ΠΌΠ°:

  • unnest_longer() Π²Π·Π΅ΠΌΠ° всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ списъка-ΠΊΠΎΠ»ΠΎΠ½Π° ΠΈ създава Π½ΠΎΠ² Ρ€Π΅Π΄.
  • unnest_wider() Π²Π·Π΅ΠΌΠ° всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ списъка-ΠΊΠΎΠ»ΠΎΠ½Π° ΠΈ създава Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π°.
  • unnest_auto() Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ опрСдСля коя ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π΅ Π½Π°ΠΉ-подходяща Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅
    unnest_longer() ΠΈΠ»ΠΈ unnest_wider().
  • hoist() Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Π½Π° unnest_wider() Π½ΠΎ сСлСктира само ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΈ позволява Ρ€Π°Π±ΠΎΡ‚Π° с няколко Π½ΠΈΠ²Π° Π½Π° влоТСност.

ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° нСструктурирани Π΄Π°Π½Π½ΠΈ с няколко Π½ΠΈΠ²Π° Π½Π° влоТСност Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ сС ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚ спомСнатитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с dplyr.

Π—Π° дСмонстрация Π½Π° Ρ‚Π΅Π·ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° repurrrsive, ΠΊΠΎΠΉΡ‚ΠΎ прСдоставя няколко слоТни, многостСпСнни списъка, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ ΠΎΡ‚ ΡƒΠ΅Π±-API.

library(tidyr)
library(dplyr)
library(repurrrsive)

ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π½Π° GitHub

НСка Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ с gh_users, списък, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° информация Π·Π° ΡˆΠ΅ΡΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π½Π° GitHub. ΠŸΡŠΡ€Π²ΠΎ Ρ‰Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ списъка gh_users Π² tibble Ρ€Π°ΠΌΠΊΠ°:

users <- tibble( user = gh_users ) 

Π’ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΌΠ°Π»ΠΊΠΎ нСясно: Π·Π°Ρ‰ΠΎ Π΄Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ списък gh_users, Π² ΠΏΠΎ-слоТна структура ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ? Но Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΡŠΡ‚ ΠΈΠΌΠ° голямо прСдимство: Ρ‚ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π° няколко Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всичко Π΅ прослСдимо Π² Π΅Π΄ΠΈΠ½ ΠΎΠ±Π΅ΠΊΡ‚.

ВсСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚Π° users прСдставлява ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ списък, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ прСдставлява ΠΊΠΎΠ»ΠΎΠ½Π°.

names(users$user[[1]])
#>  [1] "login"               "id"                  "avatar_url"         
#>  [4] "gravatar_id"         "url"                 "html_url"           
#>  [7] "followers_url"       "following_url"       "gists_url"          
#> [10] "starred_url"         "subscriptions_url"   "organizations_url"  
#> [13] "repos_url"           "events_url"          "received_events_url"
#> [16] "type"                "site_admin"          "name"               
#> [19] "company"             "blog"                "location"           
#> [22] "email"               "hireable"            "bio"                
#> [25] "public_repos"        "public_gists"        "followers"          
#> [28] "following"           "created_at"          "updated_at"

Има Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π° Π΄Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° списъка Π² ΠΊΠΎΠ»ΠΎΠ½ΠΈ. unnest_wider() Π²Π·Π΅ΠΌΠ° всСки ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ създава Π½ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π°:

users %>% unnest_wider(user)
#> # A tibble: 6 x 30
#>   login     id avatar_url gravatar_id url   html_url followers_url
#>                                
#> 1 gabo… 6.60e5 https://a… ""          http… https:/… https://api.…
#> 2 jenn… 5.99e5 https://a… ""          http… https:/… https://api.…
#> 3 jtle… 1.57e6 https://a… ""          http… https:/… https://api.…
#> 4 juli… 1.25e7 https://a… ""          http… https:/… https://api.…
#> 5 leep… 3.51e6 https://a… ""          http… https:/… https://api.…
#> 6 masa… 8.36e6 https://a… ""          http… https:/… https://api.…
#> # … с 23 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: following_url , gists_url ,
#> #   starred_url , subscriptions_url , organizations_url ,
#> #   repos_url , events_url , received_events_url ,
#> #   type , site_admin , name , company , blog ,
#> #   location , email , public_repos , public_gists ,
#> #   followers , following , created_at , updated_at ,
#> #   bio , hireable

Π’ Ρ‚ΠΎΠ·ΠΈ случай ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΡΡŠΡΡ‚ΠΎΡΡ‰Π° сС ΠΎΡ‚ 30 ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ ΠΎΡ‚ тях Π½Π΅ са Π½ΠΈ Π½ΡƒΠΆΠ½ΠΈ, Π·Π°Ρ‚ΠΎΠ²Π° вмСсто unnest_wider() ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ hoist(). hoist() Π½ΠΈ позволява Π΄Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ΅ΠΌ ΠΈΠ·Π±Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡŠΡ‰ΠΈΡ синтаксис, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈ purrr::pluck():

ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ %>% hoist(user, 
  followers = "followers", 
  login = "login", 
  url = "html_url"
)
#> # A tibble: 6 x 4
#>   followers login       url                            user             
#>       <int> <chr>       <chr>                          <list>           
#> 1       303 gaborcsardi https://github.com/gaborcsardi <named list [27]>
#> 2       780 jennybc     https://github.com/jennybc     <named list [27]>
#> 3      3958 jtleek      https://github.com/jtleek      <named list [27]>
#> 4       115 juliasilge  https://github.com/juliasilge  <named list [27]>
#> 5       213 leeper      https://github.com/leeper      <named list [27]>
#> 6        34 masalmon    https://github.com/masalmon    <named list [27]>

hoist() ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π° посочСнитС ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ ΠΎΡ‚ списъка-ΠΊΠΎΠ»ΠΎΠ½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», слСдоватСлно ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚Π΅ hoist() ΠΊΠ°Ρ‚ΠΎ прСмСстванС Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡ списък Π½Π° Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌΠ° Π΄ΠΎ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ Π³ΠΎΡ€Π½ΠΎ Π½ΠΈΠ²ΠΎ.

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Github

ΠŸΠΎΠ΄Ρ€Π°Π²Π½ΡΠ²Π°Π½Π΅ Π½Π° списъка gh_repos Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΉΠΊΠΈ Π³ΠΎ Π² tibble:

repos <- tibble(repo = gh_repos)
repos
#> # A tibble: 6 x 1
#>   repo       
#>   <list>     
#> 1 <list [30]>
#> 2 <list [30]>
#> 3 <list [30]>
#> 4 <list [26]>
#> 5 <list [30]>
#> 6 <list [30]>

Π’ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» прСдставляват списък Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈΡ‚Π΅, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π». ВсСки Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ запис, слСдоватСлно спорСд концСпцията Π·Π° ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ (Π²ΠΆ. ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ) Ρ‚Π΅ трябва Π΄Π° станат Π½ΠΎΠ²ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ unnest_longer() вмСсто unnest_wider():

repos <- repos %>% unnest_longer(repo)
repos
#> # A tibble: 176 x 1
#>    repo             
#>    <list>           
#>  1 <named list [68]>
#>  2 <named list [68]>
#>  3 <named list [68]>
#>  4 <named list [68]>
#>  5 <named list [68]>
#>  6 <named list [68]>
#>  7 <named list [68]>
#>  8 <named list [68]>
#>  9 <named list [68]>
#> 10 <named list [68]>
#> # … с ΠΎΡ‰Π΅ 166 Ρ€Π΅Π΄Π°

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ unnest_wider() ΠΈΠ»ΠΈ hoist() :

repos %>% hoist(repo, 
  login = c("owner", "login"), 
  name = "name",
  homepage = "homepage",
  watchers = "watchers_count"
)
#> # A tibble: 176 x 5
#>    login       name        homepage watchers repo             
#>    <chr>       <chr>       <chr>       <int> <list>           
#>  1 gaborcsardi after       <NA>            5 <named list [65]>
#>  2 gaborcsardi argufy      <NA>           19 <named list [65]>
#>  3 gaborcsardi ask         <NA>            5 <named list [65]>
#>  4 gaborcsardi baseimports <NA>            0 <named list [65]>
#>  5 gaborcsardi citest      <NA>            0 <named list [65]>
#>  6 gaborcsardi clisymbols  ""             18 <named list [65]>
#>  7 gaborcsardi cmaker      <NA>            0 <named list [65]>
#>  8 gaborcsardi cmark       <NA>            0 <named list [65]>
#>  9 gaborcsardi conditions  <NA>            0 <named list [65]>
#> 10 gaborcsardi crayon      <NA>           52 <named list [65]>
#> # … с ΠΎΡ‰Π΅ 166 Ρ€Π΅Π΄Π°

ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° c("owner", "login"): Ρ‚ΠΎΠ²Π° Π½ΠΈ позволява Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ стойността Π½Π° Π²Ρ‚ΠΎΡ€ΠΎ Π½ΠΈΠ²ΠΎ ΠΎΡ‚ влоТСния списък собствСник. АлтСрнативният ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅ Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ цСлият списък собствСник ΠΈ слСд Ρ‚ΠΎΠ²Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията unnest_wider() Π΄Π° сС постави всСки Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΌΡƒ Π² ΠΊΠΎΠ»ΠΎΠ½Π°:

repos %>% 
  hoist(repo, owner = "owner") %>% 
  unnest_wider(owner)
#> # A tibble: 176 x 18
#>    login     id avatar_url gravatar_id url   html_url followers_url
#>                                 
#>  1 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  2 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  3 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  4 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  5 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  6 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  7 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  8 gabo… 660288 https://a… ""          http… https:/… https://api.…
#>  9 gabo… 660288 https://a… ""          http… https:/… https://api.…
#> 10 gabo… 660288 https://a… ""          http… https:/… https://api.…
#> # … с ΠΎΡ‰Π΅ 166 Ρ€Π΅Π΄Π°, ΠΈ 11 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: following_url ,
#> #   gists_url , starred_url , subscriptions_url ,
#> #   organizations_url , repos_url , events_url ,
#> #   received_events_url , type , site_admin , repo

ВмСсто Π΄Π° сС Ρ‡ΡƒΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° функция unnest_longer() ΠΈΠ»ΠΈ unnest_wider() ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ unnest_auto(). Π’Π°Π·ΠΈ функция ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° няколко хСвристични ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π·Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈ Π½Π°ΠΉ-подходящата функция Π·Π° трансформиранС Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π·Π° избрания ΠΌΠ΅Ρ‚ΠΎΠ΄.

tibble(repo = gh_repos) %>% 
  unnest_auto(repo) %>% 
  unnest_auto(repo)
#> Using `unnest_longer(repo)`; no element has names
#> Using `unnest_wider(repo)`; elements have 68 names in common
#> # A tibble: 176 x 67
#>        id name  full_name owner private html_url description fork  url  
#>                            
#>  1 6.12e7 after gaborcsa…   2 4.05e7 argu… gaborcsa…   3 3.64e7 ask   gaborcsa…   4 3.49e7 base… gaborcsa…   5 6.16e7 cite… gaborcsa…   6 3.39e7 clis… gaborcsa…   7 3.72e7 cmak… gaborcsa…   8 6.80e7 cmark gaborcsa…   9 6.32e7 cond… gaborcsa… <nam… FALSE   https:/…         TRUE  http…
#> 10 2.43e7 cray… gaborcsa…  # … with 166 more rows, and 58 more variables: forks_url ,
#> #   keys_url , collaborators_url , teams_url ,
#> #   hooks_url , issue_events_url , events_url ,
#> #   assignees_url , branches_url , tags_url ,
#> #   blobs_url , git_tags_url , git_refs_url ,
#> #   trees_url , statuses_url , languages_url ,
#> #   stargazers_url , contributors_url , subscribers_url ,
#> #   subscription_url , commits_url , git_commits_url ,
#> #   comments_url , issue_comment_url , contents_url ,
#> #   compare_url , merges_url , archive_url ,
#> #   downloads_url , issues_url , pulls_url ,
#> #   milestones_url , notifications_url , labels_url ,
#> #   releases_url , deployments_url , created_at ,
#> #   updated_at , pushed_at , git_url , ssh_url ,
#> #   clone_url , svn_url , size , stargazers_count ,
#> #   watchers_count , language , has_issues ,
#> #   has_downloads , has_wiki , has_pages ,
#> #   forks_count , open_issues_count , forks ,
#> #   open_issues , watchers , default_branch ,
#> #   homepage

ΠŸΠ΅Ρ€ΡΠΎΠ½Π°ΠΆΠΈ Π½Π° Π˜Π³Ρ€Π° Π½Π° Ρ‚Ρ€ΠΎΠ½ΠΎΠ²Π΅

got_chars ΠΈΠΌΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° структура с gh_users: Ρ‚ΠΎΠ²Π° Π΅ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½ΠΈ ΡΠΏΠΈΡΡŠΡ†ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡ списък описва извСстСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π° гСроя ΠΎΡ‚ Π˜Π³Ρ€Π° Π½Π° Π’Ρ€ΠΎΠ½ΠΎΠ²Π΅. ΠŸΡ€Π΅Π²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ got_chars Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π΅Π½ Π²ΠΈΠ΄ Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ с създаванС Π½Π° Π΄Π°Ρ‚Π° Ρ„Ρ€Π΅ΠΉΠΌ, ΡΡŠΡ‰ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Π° слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΡΡ‚ΡŠΠ»Π±:

символи  # A tibble: 30 x 1
#>    символ           
#>               
#>  1 
#>  2 
#>  3 
#>  4 
#>  5 
#>  6 
#>  7 
#>  8 
#>  9 
#> 10 
#> # … с ΠΎΡ‰Π΅ 20 Ρ€Π΅Π΄Π°

символи2 % unnest_wider(symbol)
символи2
#> # A tibble: 30 x 18
#>    url      id name  gender culture born  died  alive titles aliases father
#>     <int>              
#>  1 http…  1022 Theo… Male   Ironbo… Π’ 2… ""    TRUE  <chr …   2 http…  1052 Tyri… Male   ""      Π’ 2… ""    TRUE  <chr …   3 http…  1074 Vict… Male   Ironbo… Π’ 2… ""    TRUE  <chr …   4 http…  1109 Will  Male   ""      ""    Π’ 2… FALSE <chr …   5 http…  1166 Areo… Male   Norvos… Π’ 2… ""    TRUE  <chr …   6 http…  1267 Chett Male   ""      На H… Π’ 2… FALSE <chr …   7 http…  1295 Cres… Male   ""      Π’ 2… Π’ 2… FALSE <chr …   8 http…   130 Aria… Female Dornish Π’ 2… ""    TRUE  <chr …   9 http…  1303 Daen… Female Valyri… Π’ 2… ""    TRUE  <chr …  10 http…  1319 Davo… Male   Wester… Π’ 2… ""    TRUE  <chr …  # … с ΠΎΡ‰Π΅ 20 Ρ€Π΅Π΄Π°, ΠΈ 7 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: mother , spouse ,
#> #   allegiances , books , povBooks , tvSeries ,
#> #   playedBy

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° got_chars Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТна ΠΎΡ‚ gh_users, Π·Π°Ρ‰ΠΎΡ‚ΠΎ някои ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° списъка символ самитС ΠΏΠΎ сСбС си прСдставляват списък, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ β€” ΡΠΏΠΈΡΡŠΡ†ΠΈ:

символи2 %>% select_if(is.list)
#> # A tibble: 30 x 7
#>    titles    aliases    allegiances books     povBooks  tvSeries  playedBy 
#>                                  
#>  1          
#>  2         
#>  3          
#>  4              
#>  5          
#>  6              
#>  7              
#>  8          
#>  9         
#> 10          
#> # … с ΠΎΡ‰Π΅ 20 Ρ€Π΅Π΄Π°

Π’Π°ΡˆΠΈΡ‚Π΅ слСдващи ΡΡ‚ΡŠΠΏΠΊΠΈ зависят ΠΎΡ‚ Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°. МоТС Π±ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π²ΡŠΠ²Π΅Π΄Π΅Ρ‚Π΅ информация Π·Π° всяка ΠΊΠ½ΠΈΠ³Π° ΠΈ сСриал, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС появява ΠΏΠ΅Ρ€ΡΠΎΠ½Π°ΠΆΡŠΡ‚:

chars2 %>% 
  select(name, books, tvSeries) %>% 
  pivot_longer(c(books, tvSeries), names_to = "media", values_to = "value") %>% 
  unnest_longer(value)
#> # A tibble: 180 x 3
#>    name             media    value            
#>                                
#>  1 Theon Greyjoy    books    A Game of Thrones
#>  2 Theon Greyjoy    books    A Storm of Swords
#>  3 Theon Greyjoy    books    A Feast for Crows
#>  4 Theon Greyjoy    tvSeries Season 1         
#>  5 Theon Greyjoy    tvSeries Season 2         
#>  6 Theon Greyjoy    tvSeries Season 3         
#>  7 Theon Greyjoy    tvSeries Season 4         
#>  8 Theon Greyjoy    tvSeries Season 5         
#>  9 Theon Greyjoy    tvSeries Season 6         
#> 10 Tyrion Lannister books    A Feast for Crows
#> # … с 170 ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€Π΅Π΄Π°

Или, ΠΌΠΎΠΆΠ΅ Π±ΠΈ, искатС Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°, която Π΄Π° ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΠΈ пСрсонаТа с ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ:

chars2 %>% 
  select(name, title = titles) %>% 
  unnest_longer(title)
#> # A tibble: 60 x 2
#>    name              title                                               
#>                                                                
#>  1 Theon Greyjoy     Prince of Winterfell                                
#>  2 Theon Greyjoy     Captain of Sea Bitch                                
#>  3 Theon Greyjoy     Lord of the Iron Islands (by law of the green lands)
#>  4 Tyrion Lannister  Acting Hand of the King (former)                    
#>  5 Tyrion Lannister  Master of Coin (former)                             
#>  6 Victarion Greyjoy Lord Captain of the Iron Fleet                      
#>  7 Victarion Greyjoy Master of the Iron Victory                          
#>  8 Will              ""                                                  
#>  9 Areo Hotah        Captain of the Guard at Sunspear                    
#> 10 Chett             ""                                                  
#> # … с 50 ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€Π΅Π΄Π°

(ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π°Π·Π½ΠΈΡ‚Π΅ стойности "" Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ title, Ρ‚ΠΎΠ²Π° Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Π³Ρ€Π΅ΡˆΠΊΠΈ, допуснати ΠΏΡ€ΠΈ въвСТданС Π½Π° Π΄Π°Π½Π½ΠΈ Π² got_chars: наистина, пСрсонаТитС, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ няма ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ΠΈ заглавия Π½Π° ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ сСриали Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ title трябва Π΄Π° ΠΈΠΌΠ°Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ с дълТина 0, Π° Π½Π΅ Π²Π΅ΠΊΡ‚ΠΎΡ€ с дълТина 1, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΠΏΡ€Π°Π·Π΅Π½ Π½ΠΈΠ·.)

МоТСм Π΄Π° ΠΏΡ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ горния ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ функцията unnest_auto(). Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½ Π·Π° Π΅Π΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅, Π½ΠΎ Π½Π΅ Π±ΠΈΠ²Π° Π΄Π° сС Ρ€Π°Π·Ρ‡ΠΈΡ‚Π° Π½Π° unnest_auto() Π·Π° Ρ€Π΅Π΄ΠΎΠ²Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Π˜ΡΡ‚ΠΈΠ½Π°Ρ‚Π° Π΅, Ρ‡Π΅ Π°ΠΊΠΎ структурата Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ unnest_auto() ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ избрания ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ; Π°ΠΊΠΎ ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Ρ‚ΠΎΠΉ Π΅ Ρ€Π°Π·Π³ΡŠΠ²Π°Π» ΡΠΏΠΈΡΡŠΡ‡Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π² Ρ€Π΅Π΄ΠΎΠ²Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ unnest_longer(), Ρ‚ΠΎ ΠΏΡ€ΠΈ промяна Π½Π° структурата Π½Π° входящитС Π΄Π°Π½Π½ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½Π° Π² ΠΏΠΎΠ»Π·Π° Π½Π° unnest_wider(), ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΡŠΠ² ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ постоянно ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π΅ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ.

tibble(char = got_chars) %>% 
  unnest_auto(char) %>% 
  select(name, title = titles) %>% 
  unnest_auto(title)
#> ИзползванС Π½Π° `unnest_wider(char)`; Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ°Ρ‚ 18 ΠΎΠ±Ρ‰ΠΈ ΠΈΠΌΠ΅Π½Π°
#> ИзползванС Π½Π° `unnest_longer(title)`; Π½ΠΈΡ‚ΠΎ Π΅Π΄ΠΈΠ½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ няма ΠΈΠΌΠ΅Π½Π°
#> # А Ρ‚ΠΈΠ±Π»ΠΈ: 60 x 2
#>    name              title                                               
#>                                                                
#>  1 Theon Greyjoy     Prince of Winterfell                                
#>  2 Theon Greyjoy     Captain of Sea Bitch                                
#>  3 Theon Greyjoy     Lord of the Iron Islands (ΠΏΠΎ Π·Π°ΠΊΠΎΠ½ Π½Π° Π·Π΅Π»Π΅Π½ΠΈΡ‚Π΅ Π·Π΅ΠΌΠΈ)
#>  4 Tyrion Lannister  Acting Hand of the King (бивш)                     
#>  5 Tyrion Lannister  Master of Coin (бивш)                              
#>  6 Victarion Greyjoy Lord Captain of the Iron Fleet                      
#>  7 Victarion Greyjoy Master of the Iron Victory                          
#>  8 Will              ""                                                  
#>  9 Areo Hotah        Captain of the Guard at Sunspear                    
#> 10 Chett             ""                                                  
#> # … с ΠΎΡ‰Π΅ 50 Ρ€Π΅Π΄Π°

Π“Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Google

Π‘Π΅Π³Π° Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-слоТна структура Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ ΠΎΡ‚ услугата Π·Π° Π³Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° Google. ΠšΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° удостовСритСлни Π΄Π°Π½Π½ΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈ Π½Π° условията Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с API Google Maps, Π·Π°Ρ‚ΠΎΠ²Π° ΠΏΡŠΡ€Π²ΠΎ Ρ‰Π΅ напиша проста ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π·Π° API. Вя Ρ‰Π΅ бъдС Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΡŽΡ‡Π° Π·Π° API Π½Π° Google Maps Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° срСдата; Π°ΠΊΠΎ Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° срСдата Π½Π΅ Π΅ Π·Π°ΠΏΠ°Π·Π΅Π½ ΠΊΠ»ΡŽΡ‡ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с API Google Maps, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΊΠΎΠ΄Π°, прСдставСни Π² Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π», няма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ изпълнСни.

has_key <- !identical(Sys.getenv("GOOGLE_MAPS_API_KEY"), "")
if (!has_key) {
  message("НС Π΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ ΠΊΠ»ΡŽΡ‡ Π·Π° Google Maps API; Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΊΠΎΠ΄Π° няма Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ изпълнСни")
}

# https://developers.google.com/maps/documentation/geocoding
geocode <- function(address, api_key = Sys.getenv("GOOGLE_MAPS_API_KEY")) {
  url <- "https://maps.googleapis.com/maps/api/geocode/json"
  url <- paste0(url, "?address=", URLencode(address), "&key=", api_key)

  jsonlite::read_json(url)
}

Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π²Ρ€ΡŠΡ‰Π° Ρ‚Π°Π·ΠΈ функция, Π΅ доста слоТСн:

Ρ…ΡŽΡΡ‚ΡŠΠ½ 
стр(Ρ…ΡŽΡΡ‚ΡŠΠ½)
#> Бписък ΠΎΡ‚ 2
#>  $ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ:Бписък ΠΎΡ‚ 1
#>   ..$ :Бписък ΠΎΡ‚ 5
#>   .. ..$ адрСс_ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ:Бписък ΠΎΡ‚ 4
#>   .. .. ..$ :Бписък ΠΎΡ‚ 3
#>   .. .. .. ..$ дълго_ΠΈΠΌΠ΅ : chr "Π₯ΡŽΡΡ‚ΡŠΠ½"
#>   .. .. .. ..$ ΠΊΡ€Π°Ρ‚ΠΊΠΎ_ΠΈΠΌΠ΅: chr "Π₯ΡŽΡΡ‚ΡŠΠ½"
#>   .. .. .. ..$ Ρ‚ΠΈΠΏΠΎΠ²Π΅     :Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ : chr "Π³Ρ€Π°Π΄"
#>   .. .. .. .. ..$ : chr "политичСски"
#>   .. .. ..$ :Бписък ΠΎΡ‚ 3
#>   .. .. .. ..$ дълго_ΠΈΠΌΠ΅ : chr "ΠžΠΊΡ€ΡŠΠ³ Π₯арис"
#>   .. .. .. ..$ ΠΊΡ€Π°Ρ‚ΠΊΠΎ_ΠΈΠΌΠ΅: chr "ΠžΠΊΡ€ΡŠΠ³ Π₯арис"
#>   .. .. .. ..$ Ρ‚ΠΈΠΏΠΎΠ²Π΅     :Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ : chr "административно_nΠΈΠ²ΠΎ_2"
#>   .. .. .. .. ..$ : chr "политичСски"
#>   .. .. ..$ :Бписък ΠΎΡ‚ 3
#>   .. .. .. ..$ дълго_имС : chr "ВСксас"
#>   .. .. .. ..$ ΠΊΡ€Π°Ρ‚ΠΊΠΎ_ΠΈΠΌΠ΅: chr "Π’Π₯"
#>   .. .. .. ..$ Ρ‚ΠΈΠΏΠΎΠ²Π΅     :Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ : chr "административно_nΠΈΠ²ΠΎ_1"
#>   .. .. .. .. ..$ : chr "политичСски"
#>   .. .. ..$ :Бписък ΠΎΡ‚ 3
#>   .. .. .. ..$ дълго_ΠΈΠΌΠ΅ : chr "БъСдинСни Ρ‰Π°Ρ‚ΠΈ"
#>   .. .. .. ..$ ΠΊΡ€Π°Ρ‚ΠΊΠΎ_ΠΈΠΌΠ΅: chr "БА"
#>   .. .. .. ..$ Ρ‚ΠΈΠΏΠΎΠ²Π΅     :Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ : chr "Π΄ΡŠΡ€ΠΆΠ°Π²Π°"
#>   .. .. .. .. ..$ : chr "политичСски"
#>   .. ..$ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½_адрСс : chr "Π₯ΡŽΡΡ‚ΡŠΠ½, Π’Π₯, БА"
#>   .. ..$ гСомСтрия          :Бписък ΠΎΡ‚ 4
#>   .. .. ..$ Π³Ρ€Π°Π½ΠΈΡ†ΠΈ       :Бписък ΠΎΡ‚ 2
#>   .. .. .. ..$ сСвСроизток:Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ ΡˆΠΈΡ€ΠΈΠ½Π°: num 30.1
#>   .. .. .. .. ..$ дълТина: num -95
#>   .. .. .. ..$ югозапад:Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ ΡˆΠΈΡ€ΠΈΠ½Π°: num 29.5
#>   .. .. .. .. ..$ дълТина: num -95.8
#>   .. .. ..$ мСстополоТСниС     :Бписък ΠΎΡ‚ 2
#>   .. .. .. ..$ ΡˆΠΈΡ€ΠΈΠ½Π°: num 29.8
#>   .. .. .. ..$ дълТина: num -95.4
#>   .. .. ..$ Ρ‚ΠΈΠΏ_мСстополоТСниС: chr "ΠŸΠ Π˜Π‘Π›Π˜Π—Π˜Π’Π•Π›ΠΠž"
#>   .. .. ..$ Π²ΠΈΠ·ΡŒΠΎΡ€     :Бписък ΠΎΡ‚ 2
#>   .. .. .. ..$ сСвСроизток:Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ ΡˆΠΈΡ€ΠΈΠ½Π°: num 30.1
#>   .. .. .. .. ..$ дълТина: num -95
#>   .. .. .. ..$ югозапад:Бписък ΠΎΡ‚ 2
#>   .. .. .. .. ..$ ΡˆΠΈΡ€ΠΈΠ½Π°: num 29.5
#>   .. .. .. .. ..$ дълТина: num -95.8
#>   .. ..$ place_id          : chr "ChIJAYWNSLS4QIYROwVl894CDco"
#>   .. ..$ Ρ‚ΠΈΠΏΠΎΠ²Π΅             :Бписък ΠΎΡ‚ 2
#>   .. .. ..$ : chr "Π³Ρ€Π°Π΄"
#>   .. .. ..$ : chr "политичСски"
#>  $ статус : chr "OK"

Щастливи смС, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ ΡΡ‚ΡŠΠΏΠΊΠ° ΠΏΠΎ ΡΡ‚ΡŠΠΏΠΊΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tidyr. Π—Π° Π΄Π° направя Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТна ΠΈ рСалистична, Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π° с Π³Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° няколко Π³Ρ€Π°Π΄Π°:

  Π³Ρ€Π°Π΄ <-   c ( "Π₯ΡŽΡΡ‚ΡŠΠ½" , "ЛА" , "Ню Π™ΠΎΡ€ΠΊ" , "Π§ΠΈΠΊΠ°Π³ΠΎ" , "Π‘ΠΏΡ€ΠΈΠ½Π³Ρ„ΠΈΠ»Π΄" )  Π³Ρ€Π°Π΄_Π³Π΅ΠΎ <-   purrr::map (Π³Ρ€Π°Π΄, Π³Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅) 

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡΡ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‰Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌ Π² tibble, Π·Π° удобство Ρ‰Π΅ добавя ΠΊΠΎΠ»ΠΎΠ½Π° с ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° Π³Ρ€Π°Π΄Π°.

Π»ΠΎΠΊ <- tibble(Π³Ρ€Π°Π΄ = Π³Ρ€Π°Π΄, json = Π³Ρ€Π°Π΄_Π³Π΅ΠΎ)
Π»ΠΎΠΊ
#> # A tibble: 5 x 2
#>   Π³Ρ€Π°Π΄        json            
#>   <chr>       <list>          
#> 1 Π₯ΡŽΡΡ‚ΡŠΠ½     <named list [2]>
#> 2 ЛА          <named list [2]>
#> 3 Ню Π™ΠΎΡ€ΠΊ    <named list [2]>
#> 4 Π§ΠΈΠΊΠ°Π³ΠΎ     <named list [2]>
#> 5 Π‘ΠΏΡ€ΠΈΠ½Π³Ρ„ΠΈΠ»Π΄ <named list [2]>

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½ΠΈΠ²ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ статус ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π°Π·Π³ΡŠΠ½Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° unnest_wider() :

Π»ΠΎΠΊ %>%
  unnest_wider(json)
#> # A tibble: 5 x 3
#>   Π³Ρ€Π°Π΄        Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ    статус
#>   <chr>       <list>     <chr> 
#> 1 Π₯ΡŽΡΡ‚ΡŠΠ½     <list [1]> OK    
#> 2 ЛА          <list [1]> OK    
#> 3 Ню Π™ΠΎΡ€ΠΊ    <list [1]> OK    
#> 4 Π§ΠΈΠΊΠ°Π³ΠΎ     <list [1]> OK    
#> 5 Π‘ΠΏΡ€ΠΈΠ½Π³Ρ„ΠΈΠ»Π΄ <list [1]> OK

ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ Π΅ многостСпСнСн списък. ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ Π³Ρ€Π°Π΄ΠΎΠ²Π΅ ΠΈΠΌΠ°Ρ‚ 1 Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ (прСдставляващ ΡƒΠ½ΠΈΠΊΠ°Π»Π½Π°Ρ‚Π° стойност, която ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° API Π·Π° Π³Π΅ΠΎΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅), Π½ΠΎ Π·Π° Π‘ΠΏΡ€ΠΈΠ½Π³Ρ„ΠΈΠ»Π΄ Ρ‚Π΅ са Π΄Π²Π°. МоТСм Π΄Π° Π³ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° unnest_longer() :

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results)
#> # A tibble: 5 x 3
#>   city        results          status
#>                      
#> 1 Houston      OK    
#> 2 LA           OK    
#> 3 New York     OK    
#> 4 Chicago      OK    
#> 5 Springfield  OK

Π‘Π΅Π³Π° всички Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ Π΅Π΄Π½Π°ΠΊΠ²ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° unnest_wider():

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results) %>% 
  unnest_wider(results)
#> # A tibble: 5 x 7
#>   city   address_componen… formatted_addre… geometry place_id  types status
#>                                       
#> 1 Houst…         Houston, TX, USA <named … ChIJAYWN…  2 LA             Los Angeles, CA… <named … ChIJE9on…  3 New Y…         New York, NY, U… <named … ChIJOwg_…  4 Chica…         Chicago, IL, USA <named … ChIJ7cv0…  5 Sprin…         Springfield, MO… <named … ChIJP5jI… <lis… OK

МоТСм Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° ΡˆΠΈΡ€ΠΈΠ½Π°Ρ‚Π° ΠΈ Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° всСки Π³Ρ€Π°Π΄, Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°ΠΉΠΊΠΈ списъка geometry:

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results) %>% 
  unnest_wider(results) %>% 
  unnest_wider(geometry)
#> # A tibble: 5 x 10
#>   city  address_compone… formatted_addre… bounds location location_type
#>                                       
#> 1 Hous…        Houston, TX, USA <name…  2 LA           Los Angeles, CA… <name…  3 New …        New York, NY, U… <name…  4 Chic…        Chicago, IL, USA <name…  5 Spri…        Springfield, MO… <name…  # … with 4 more variables: viewport , place_id , types ,
#> #   status

И слСд Ρ‚ΠΎΠ²Π° мСстополоТСниСто, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π° Ρ€Π°Π·ΡˆΠΈΡ€ΠΈΠΌ location:

loc %>%
  unnest_wider(json) %>%
  unnest_longer(results) %>%
  unnest_wider(results) %>%
  unnest_wider(geometry) %>%
  unnest_wider(location)
#> # A tibble: 5 x 11
#>   city  address_compone… formatted_addre… bounds   lat    lng location_type
#>                                         
#> 1 Hous…        Houston, TX, USA  2 LA           Los Angeles, CA…  3 New …        New York, NY, U…  4 Chic…        Chicago, IL, USA  5 Spri…        Springfield, MO…  # … with 4 more variables: viewport , place_id , types ,
#> #   status

ΠžΡ‚Π½ΠΎΠ²ΠΎ, unnest_auto() ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π° опСрацията с извСстни рисковС, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² структурата Π½Π° входящитС Π΄Π°Π½Π½ΠΈ:

loc %>%
  unnest_auto(json) %>%
  unnest_auto(results) %>%
  unnest_auto(results) %>%
  unnest_auto(geometry) %>%
  unnest_auto(location)
#> Using `unnest_wider(json)`; elements have 2 names in common
#> Using `unnest_longer(results)`; no element has names
#> Using `unnest_wider(results)`; elements have 5 names in common
#> Using `unnest_wider(geometry)`; elements have 4 names in common
#> Using `unnest_wider(location)`; elements have 2 names in common
#> # A tibble: 5 x 11
#>   city  address_compone… formatted_addre… bounds   lat    lng location_type
#>                                         
#> 1 Hous…        Houston, TX, USA  2 LA           Los Angeles, CA…  3 New …        New York, NY, U…  4 Chic…        Chicago, IL, USA  5 Spri…        Springfield, MO…  # … with 4 more variables: viewport , place_id , types ,
#> #   status

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡŠΡ€Π²ΠΈΡ адрСс Π·Π° всСки Π³Ρ€Π°Π΄:

loc %>%
  unnest_wider(json) %>%
  hoist(results, first_result = 1) %>%
  unnest_wider(first_result) %>%
  unnest_wider(geometry) %>%
  unnest_wider(location)
#> # A tibble: 5 x 11
#>   city  address_compone… formatted_addre… bounds   lat    lng location_type
#>                                         
#> 1 Hous…        Houston, TX, USA  2 LA           Los Angeles, CA…  3 New …        New York, NY, U…  4 Chic…        Chicago, IL, USA  5 Spri…        Springfield, MO…  # … with 4 more variables: viewport , place_id , types ,
#> #   status

Или Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ hoist() Π·Π° многостСпСнно Π½Π°Π²Π»ΠΈΠ·Π°Π½Π΅, Π·Π° Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ към lat ΠΈ lng.

loc %>
  hoist(json,
    lat = list("results", 1, "geometry", "location", "lat"),
    lng = list("results", 1, "geometry", "location", "lng")
  )
#> # A tibble: 5 x 4
#>   city          lat    lng json            
#>                       
#> 1 Houston      29.8  -95.4 
#> 2 LA           34.1 -118.  
#> 3 New York     40.7  -74.0 
#> 4 Chicago      41.9  -87.6 
#> 5 Springfield  37.2  -93.3

Дискография Π½Π° Π¨Π°Ρ€Π»Π° Π“Π΅Π»Ρ„Π°Π½Π΄

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π°ΠΉ-слоТната конструкция β€” дискографията Π½Π° Π¨Π°Ρ€Π»Π° Π“Π΅Π»Ρ„Π°Π½Π΄. ΠšΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ с ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° списъка Π² Π΄Π°Ρ‚Π°Ρ„Ρ€Π΅ΠΉΠΌ с Π΅Π΄ΠΈΠ½ ΡΡ‚ΡŠΠ»Π±, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π³ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€ΠΈΠΌ, Π·Π° Π΄Π° станС всСки ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΡΡ‚ΡŠΠ»Π±. ОсвСн Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌ ΡΡ‚ΡŠΠ»Π±Π° date_added Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π΄Π°Ρ‚Π° ΠΈ час Π² R.

discs % 
  unnest_wider(disc) %>% 
  mutate(date_added = as.POSIXct(strptime(date_added, "%Y-%m-%dT%H:%M:%S"))) 
discs
#> # A tibble: 155 x 5
#>    instance_id date_added          basic_information       id rating
#>                                          
#>  1   354823933 2019-02-16 17:48:59   7496378      0
#>  2   354092601 2019-02-13 14:13:11   4490852      0
#>  3   354091476 2019-02-13 14:07:23   9827276      0
#>  4   351244906 2019-02-02 11:39:58   9769203      0
#>  5   351244801 2019-02-02 11:39:37   7237138      0
#>  6   351052065 2019-02-01 20:40:53  13117042      0
#>  7   350315345 2019-01-29 15:48:37   7113575      0
#>  8   350315103 2019-01-29 15:47:22  10540713      0
#>  9   350314507 2019-01-29 15:44:08  11260950      0
#> 10   350314047 2019-01-29 15:41:35  11726853      0
#> # … with 145 more rows

На Ρ‚ΠΎΠ²Π° Π½ΠΈΠ²ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ информация Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ³Π° всСки диск Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π² дискографията Π½Π° Π¨Π°Ρ€Π»Π°, Π½ΠΎ Π½Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° самитС дисковС. Π—Π° Ρ‚ΠΎΠ²Π° трябва Π΄Π° Ρ€Π°Π·ΡˆΠΈΡ€ΠΈΠΌ ΡΡ‚ΡŠΠ»Π±Π° basic_information:

discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.

Π—Π° съТалСниС Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π³Ρ€Π΅ΡˆΠΊΠ°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π² списъка basic_information ΠΈΠΌΠ° ΡΡ‚ΡŠΠ»Π± с Ρ‚Π°ΠΊΠΎΠ²Π° ΠΈΠΌΠ΅ basic_information. ΠšΠΎΠ³Π°Ρ‚ΠΎ сС появи Ρ‚Π°ΠΊΠ°Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Π·Π° Π΄Π° сС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Π±ΡŠΡ€Π·ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° names_repair = "unique":

дисков %>% unnest_wider(basic_information, names_repair = "unique")
#> Нови имСна:
#> * id -> id...6
#> * id -> id...14
#> # Π’ΠΈΠ±Π»Π°: 155 x 15
#>    instance_id date_added          labels  year artists id...6 thumb title
#>                                
#>  1   354823933 2019-02-16 17:48:59 <list…  2015   2   354092601 2019-02-13 14:13:11 <list…  2013   3   354091476 2019-02-13 14:07:23 <list…  2017   4   351244906 2019-02-02 11:39:58 <list…  2017   5   351244801 2019-02-02 11:39:37 <list…  2015   6   351052065 2019-02-01 20:40:53 <list…  2019   7   350315345 2019-01-29 15:48:37 <list…  2014   8   350315103 2019-01-29 15:47:22 <list…  2015   9   350314507 2019-01-29 15:44:08 <list…  2017  10   350314047 2019-01-29 15:41:35 <list…  2017  # … с 145 ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΈ 7 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ ,
#> #   cover_image , resource_url , master_id ,
#> #   master_url , id...14 , Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚Π° Π΅, Ρ‡Π΅ basic_information повтаря ΠΊΠΎΠ»ΠΎΠ½Π°Ρ‚Π° id, която ΡΡŠΡ‰ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π½Π° Π½Π°ΠΉ-високото Π½ΠΈΠ²ΠΎ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄Π° я ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ΠΌ:

дисков %>% 
  select(-id) %>% 
  unnest_wider(basic_information)
#> # Π’ΠΈΠ±Π»Π°: 155 x 14
#>    instance_id date_added          labels  year artists     id thumb title
#>                                
#>  1   354823933 2019-02-16 17:48:59 <list…  2015   2   354092601 2019-02-13 14:13:11 <list…  2013   3   354091476 2019-02-13 14:07:23 <list…  2017   4   351244906 2019-02-02 11:39:58 <list…  2017   5   351244801 2019-02-02 11:39:37 <list…  2015   6   351052065 2019-02-01 20:40:53 <list…  2019   7   350315345 2019-01-29 15:48:37 <list…  2014   8   350315103 2019-01-29 15:47:22 <list…  2015   9   350314507 2019-01-29 15:44:08 <list…  2017  10   350314047 2019-01-29 15:41:35 <list…  2017  # … с 145 ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅ ΠΈ 6 Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ: Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ ,
#> #   cover_image , resource_url , master_id ,
#> #   master_url , Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³

ΠšΠ°Ρ‚ΠΎ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ hoist():

дисков %>% 
  hoist(basic_information,
    title = "title",
    year = "year",
    label = list("labels", 1, "name"),
    artist = list("artists", 1, "name")
  )
#>% # A tibble: 155 x 9
#>%    instance_id date_added          title  year label artist
#>%                             
#>%  1   354823933 2019-02-16 17:48:59 Demo   2015 Tobi… Mollot
#>%  2   354092601 2019-02-13 14:13:11 Obse…  2013 La V… Una B…
#>%  3   354091476 2019-02-13 14:07:23 I      2017 La V… S.H.I…
#>%  4   351244906 2019-02-02 11:39:58 OΓ­do…  2017 La V… Rata …
#>%  5   351244801 2019-02-02 11:39:37 A Ca…  2015 Kato… Ivy (…
#>%  6   351052065 2019-02-01 20:40:53 Tash…  2019 High… Tashme
#>%  7   350315345 2019-01-29 15:48:37 Demo   2014 Mind… Desgr…
#>%  8   350315103 2019-01-29 15:47:22 Let …  2015 Not … Phant…
#>%  9   350314507 2019-01-29 15:44:08 Sub …  2017 Not … Sub S…
#>% 10   350314047 2019-01-29 15:41:35 Demo   2017 Pres… Small…
#>% # … с 145 Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ строками ΠΈ 3 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ: basic_information ,
#>% #   id , rating

Π’ΡƒΠΊ Π±ΡŠΡ€Π·ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π°ΠΌ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ лСйбъл ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Ρ ΠΏΠΎ индСкса, потапяйки сС Π² Π²Π»ΠΎΠΆΠ΅Π½ списък.

По-систСматичният ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΅ Π΄Π° сС ΡΡŠΠ·Π΄Π°Π΄Π°Ρ‚ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π·Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Ρ ΠΈ лСйбъла:

дисковС %>% 
  hoist(basic_information, artist = "artists") %>% 
  select(disc_id = id, artist) %>% 
  unnest_longer(artist) %>% 
  unnest_wider(artist)
#>% # A tibble: 167 x 8
#>%     disc_id join  name        anv   tracks role  resource_url            id
#>%                                    
#>%  1  7496378 ""    Mollot      ""    ""     ""    https://api.discog… 4.62e6
#>%  2  4490852 ""    Una BΓ¨stia… ""    ""     ""    https://api.discog… 3.19e6
#>%  3  9827276 ""    S.H.I.T. (… ""    ""     ""    https://api.discog… 2.77e6
#>%  4  9769203 ""    Rata Negra  ""    ""     ""    https://api.discog… 4.28e6
#>%  5  7237138 ""    Ivy (18)    ""    ""     ""    https://api.discog… 3.60e6
#>%  6 13117042 ""    Tashme      ""    ""     ""    https://api.discog… 5.21e6
#>%  7  7113575 ""    Desgraciad… ""    ""     ""    https://api.discog… 4.45e6
#>%  8 10540713 ""    Phantom He… ""    ""     ""    https://api.discog… 4.27e6
#>%  9 11260950 ""    Sub Space … ""    ""     ""    https://api.discog… 5.69e6
#>% 10 11726853 ""    Small Man … ""    ""     ""    https://api.discog… 6.37e6
#>% # … с 157 Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅Π΄Π°

dисковС %>% 
  hoist(basic_information, format = "formats") %>% 
  select(disc_id = id, format) %>% 
  unnest_longer(format) %>% 
  unnest_wider(format) %>% 
  unnest_longer(descriptions)
#>% # A tibble: 280 x 5
#>%     disc_id descriptions text  name     qty  
#>%                     
#>%  1  7496378 Numbered     Black Cassette 1    
#>%  2  4490852 LP             Vinyl    1    
#>%  3  9827276 "7""          Vinyl    1    
#>%  4  9827276 45 RPM         Vinyl    1    
#>%  5  9827276 EP             Vinyl    1    
#>%  6  9769203 LP             Vinyl    1    
#>%  7  9769203 Album          Vinyl    1    
#>%  8  7237138 "7""          Vinyl    1    
#>%  9  7237138 45 RPM         Vinyl    1    
#>% 10 13117042 "7""          Vinyl    1    
#>% # … с 270 Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π΅Π΄Π°

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ към оригиналния Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ ядрото Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° tidyverse Π²Π»ΠΈΠ·Π°Ρ‚ мноТСство ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ ΠΎΡ‚ ΠΎΠ±Ρ‰Π° философия Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ сСмСйството ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unnest_*(), ΠΊΠΎΠΈΡ‚ΠΎ са насочСни към Ρ€Π°Π±ΠΎΡ‚Π° с ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΡ‚ Π²Π»ΠΎΠΆΠ΅Π½ΠΈ ΡΠΏΠΈΡΡŠΡ†ΠΈ. Π’ΠΎΠ·ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° мноТСство Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ опростяват ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ съгласно концСпцията Π·Π° ΠŸΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π΄Π°Π½Π½ΠΈ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster