рдиреЗрд╕реНрдЯреЗрдб рд╕реНрддрдореНрднрд╣рд░реВ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрджреИ - R рднрд╛рд╖рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд╕реВрдЪреАрд╣рд░реВ (tidyr рдкреНрдпрд╛рдХреЗрдЬ рд░ unnest рдкрд░рд┐рд╡рд╛рд░рдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ)

рдкреНрд░рд╛рдпрдЬрд╕реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, API рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛ рдЬрдЯрд┐рд▓ рд░реВрдЦ рд╕рдВрд░рдЪрдирд╛ рднрдПрдХреЛ рдХреБрдиреИ рдЕрдиреНрдп рдбреЗрдЯрд╛рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛, рддрдкрд╛рдЗрдБ JSON рд░ XML рдврд╛рдБрдЪрд╛рд╣рд░реВрдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред

рдпреА рдврд╛рдБрдЪрд╛рд╣рд░реВрдорд╛ рдзреЗрд░реИ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН: рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдбрд╛рдЯрд╛рд▓рд╛рдИ рдПрдХрджрдо рдХрдореНрдкреНрдпрд╛рдХреНрдЯ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫрдиреН рд░ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирдХреНрдХрд▓рдмрд╛рдЯ рдмрдЪреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдпреА рдврд╛рдБрдЪрд╛рд╣рд░реВрдХреЛ рд╣рд╛рдирд┐ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкреНрд░рд╢реЛрдзрди рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛред рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛ рдЧрдгрдирд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди рд░ рддреНрдпрд╕рдорд╛ рджреГрд╢реНрдп рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрдиред

рдиреЗрд╕реНрдЯреЗрдб рд╕реНрддрдореНрднрд╣рд░реВ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрджреИ - R рднрд╛рд╖рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд╕реВрдЪреАрд╣рд░реВ (tidyr рдкреНрдпрд╛рдХреЗрдЬ рд░ unnest рдкрд░рд┐рд╡рд╛рд░рдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ)

рдпреЛ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдиреНрддрд░рддрд╛ рд╣реЛ "R рдкреНрдпрд╛рдХреЗрдЬ tidyr рд░ рдпрд╕рдХреЛ рдирдпрд╛рдБ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ pivot_longer рд░ pivot_wider"ред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрдпрд╛рдХреЗрдЬрдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВрд▓рд╛рдИ рдкрд░рд┐рдЪрд┐рдд рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рддрд╛рд▓рд┐рдХрд╛рдХреЛ рд░реВрдкрдорд╛ рдЙрдкрдпреБрдХреНрдд рдмрдирд╛рдЙрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред tidyr, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХреЛрд░ рдорд╛ рд╕рдорд╛рд╡реЗрд╢ tidyverse, рд░ рдпрд╕рдХреЛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдкрд░рд┐рд╡рд╛рд░ unnest_*().

рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдореЗрд░реЛ рдорд╛ рд░реБрдЪрд┐ рд░рд╛рдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо ╨╕ YouTube рдЪреНрдпрд╛рдирд▓рд╣рд░реВред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдордЧреНрд░реА рдЖрд░ рднрд╛рд╖рд╛рдорд╛ рд╕рдорд░реНрдкрд┐рдд рдЫред

  1. рдкрд░рд┐рдЪрдп
  2. GitHub рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ
  3. Github рднрдгреНрдбрд╛рд░рд╣рд░реВ
  4. рдЧреЗрдо рдЕрдл рдереНрд░реЛрдиреНрд╕рдХрд╛ рдкрд╛рддреНрд░рд╣рд░реВ
  5. рдЧреБрдЧрд▓рд╕рдБрдЧ рдЬрд┐рдпреЛрдХреЛрдбрд┐рдЩ
  6. Sharla Gelfand рдХреЛ рдбрд┐рд╕реНрдХреЛрдЧреНрд░рд╛рдлреА
  7. рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдкрд░рд┐рдЪрдп

рдЖрдпрддрд╛рдХрд╛рд░ (рдЕрдиреБрд╡рд╛рджрдХрдХреЛ рдЯрд┐рдкреНрдкрдгреА, рдореИрд▓реЗ рдпреЛ рд╢рдмреНрджрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрд╡рд╛рдж рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрди, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рддреНрдпрд╕реНрддреИ рдЫреЛрдбреНрдиреЗрдЫреМрдВред) рдкрд░рд┐рдЪрд┐рдд рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рд░ рд╕реНрддрдореНрднрд╣рд░реВ рдорд┐рд▓реЗрд░ рдмрдиреЗрдХреЛ рджреБрдИ-рдЖрдпрд╛рдореА рддрд╛рд▓рд┐рдХрд╛рдорд╛ рдиреЗрд╕реНрдЯреЗрдб рдПрд░реЗрд╣рд░реВрд╕рдБрдЧ рдЕрд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рд▓реНрдпрд╛рдЙрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛред IN 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 ╨▓ рдЯрд┐рдмрд▓ рдлреНрд░реЗрдо:

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
#>   <chr>  <int> <chr>      <chr>       <chr> <chr>    <chr>        
#> 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.тАж
#> # тАж with 23 more variables: following_url <chr>, gists_url <chr>,
#> #   starred_url <chr>, subscriptions_url <chr>, organizations_url <chr>,
#> #   repos_url <chr>, events_url <chr>, received_events_url <chr>,
#> #   type <chr>, site_admin <lgl>, name <chr>, company <chr>, blog <chr>,
#> #   location <chr>, email <chr>, public_repos <int>, public_gists <int>,
#> #   followers <int>, following <int>, created_at <chr>, updated_at <chr>,
#> #   bio <chr>, hireable <lgl>

рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рд╣рд╛рдореАрд╕рдБрдЧ 30 рд╕реНрддрдореНрднрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рднрдПрдХреЛ рддрд╛рд▓рд┐рдХрд╛ рдЫ, рд░ рд╣рд╛рдореАрд▓рд╛рдИ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдзреЗрд░реИрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рдХреЛ рд╕рдЯреНрдЯрд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ unnest_wider() рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН hoist(). hoist() рд╣рд╛рдореАрд▓рд╛рдИ рдЙрд╣реА рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЪрдпрди рдЧрд░рд┐рдПрдХрд╛ рдШрдЯрдХрд╣рд░реВ рдирд┐рдХрд╛рд▓реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ purrr::pluck():

users %>% 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]>
#> # тАж with 166 more rows

рдЕрдм рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ 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]>
#> # тАж with 166 more rows

рдЙрдкрдпреЛрдЧ рдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН c("owner", "login"): рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдиреЗрд╕реНрдЯреЗрдб рд╕реВрдЪреАрдмрд╛рдЯ рджреЛрд╕реНрд░реЛ рд╕реНрддрд░рдХреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ ownerред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдореНрдкреВрд░реНрдг рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдЫ owner рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ 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
#>    <chr>  <int> <chr>      <chr>       <chr> <chr>    <chr>        
#>  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.тАж
#> # тАж with 166 more rows, and 11 more variables: following_url <chr>,
#> #   gists_url <chr>, starred_url <chr>, subscriptions_url <chr>,
#> #   organizations_url <chr>, repos_url <chr>, events_url <chr>,
#> #   received_events_url <chr>, type <chr>, site_admin <lgl>, repo <list>

рд╕рд╣реА рдкреНрд░рдХрд╛рд░реНрдп рдЫрдиреМрдЯ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд╕реЛрдЪреНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ 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  
#>     <int> <chr> <chr>     <lis> <lgl>   <chr>    <chr>       <lgl> <chr>
#>  1 6.12e7 after gaborcsaтАж <namтАж FALSE   https:/тАж Run Code iтАж FALSE httpтАж
#>  2 4.05e7 arguтАж gaborcsaтАж <namтАж FALSE   https:/тАж DeclarativтАж FALSE httpтАж
#>  3 3.64e7 ask   gaborcsaтАж <namтАж FALSE   https:/тАж Friendly CтАж FALSE httpтАж
#>  4 3.49e7 baseтАж gaborcsaтАж <namтАж FALSE   https:/тАж Do we get тАж FALSE httpтАж
#>  5 6.16e7 citeтАж gaborcsaтАж <namтАж FALSE   https:/тАж Test R pacтАж TRUE  httpтАж
#>  6 3.39e7 clisтАж gaborcsaтАж <namтАж FALSE   https:/тАж Unicode syтАж FALSE httpтАж
#>  7 3.72e7 cmakтАж gaborcsaтАж <namтАж FALSE   https:/тАж port of cmтАж TRUE  httpтАж
#>  8 6.80e7 cmark gaborcsaтАж <namтАж FALSE   https:/тАж CommonMarkтАж TRUE  httpтАж
#>  9 6.32e7 condтАж gaborcsaтАж <namтАж FALSE   https:/тАж <NA>        TRUE  httpтАж
#> 10 2.43e7 crayтАж gaborcsaтАж <namтАж FALSE   https:/тАж R package тАж FALSE httpтАж
#> # тАж with 166 more rows, and 58 more variables: forks_url <chr>,
#> #   keys_url <chr>, collaborators_url <chr>, teams_url <chr>,
#> #   hooks_url <chr>, issue_events_url <chr>, events_url <chr>,
#> #   assignees_url <chr>, branches_url <chr>, tags_url <chr>,
#> #   blobs_url <chr>, git_tags_url <chr>, git_refs_url <chr>,
#> #   trees_url <chr>, statuses_url <chr>, languages_url <chr>,
#> #   stargazers_url <chr>, contributors_url <chr>, subscribers_url <chr>,
#> #   subscription_url <chr>, commits_url <chr>, git_commits_url <chr>,
#> #   comments_url <chr>, issue_comment_url <chr>, contents_url <chr>,
#> #   compare_url <chr>, merges_url <chr>, archive_url <chr>,
#> #   downloads_url <chr>, issues_url <chr>, pulls_url <chr>,
#> #   milestones_url <chr>, notifications_url <chr>, labels_url <chr>,
#> #   releases_url <chr>, deployments_url <chr>, created_at <chr>,
#> #   updated_at <chr>, pushed_at <chr>, git_url <chr>, ssh_url <chr>,
#> #   clone_url <chr>, svn_url <chr>, size <int>, stargazers_count <int>,
#> #   watchers_count <int>, language <chr>, has_issues <lgl>,
#> #   has_downloads <lgl>, has_wiki <lgl>, has_pages <lgl>,
#> #   forks_count <int>, open_issues_count <int>, forks <int>,
#> #   open_issues <int>, watchers <int>, default_branch <chr>,
#> #   homepage <chr>

рдЧреЗрдо рдЕрдл рдереНрд░реЛрдиреНрд╕рдХрд╛ рдкрд╛рддреНрд░рд╣рд░реВ

got_chars рдХреЛ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдЫ gh_users: рдпреЛ рдирд╛рдорд┐рдд рд╕реВрдЪреАрд╣рд░реВрдХреЛ рд╕реЗрдЯ рд╣реЛ, рдЬрд╣рд╛рдБ рднрд┐рддреНрд░реА рд╕реВрдЪреАрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡рд▓реЗ рдЧреЗрдо рдЕрдл рдереНрд░реЛрдиреНрд╕ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рдХреЛ рдХреЗрд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫред рд▓реНрдпрд╛рдЙрдБрджреИ got_chars рддрд╛рд▓рд┐рдХрд╛ рджреГрд╢реНрдпрдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдЕрдШрд┐рд▓реНрд▓реЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдЬрд╕реНрддреИ, рдорд┐рддрд┐ рдлреНрд░реЗрдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рд╕реНрддрдореНрднрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдЫреМрдВ:

chars <- tibble(char = got_chars)
chars
#> # A tibble: 30 x 1
#>    char             
#>    <list>           
#>  1 <named list [18]>
#>  2 <named list [18]>
#>  3 <named list [18]>
#>  4 <named list [18]>
#>  5 <named list [18]>
#>  6 <named list [18]>
#>  7 <named list [18]>
#>  8 <named list [18]>
#>  9 <named list [18]>
#> 10 <named list [18]>
#> # тАж with 20 more rows

chars2 <- chars %>% unnest_wider(char)
chars2
#> # A tibble: 30 x 18
#>    url      id name  gender culture born  died  alive titles aliases father
#>    <chr> <int> <chr> <chr>  <chr>   <chr> <chr> <lgl> <list> <list>  <chr> 
#>  1 httpтАж  1022 TheoтАж Male   IronboтАж In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#>  2 httpтАж  1052 TyriтАж Male   ""      In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#>  3 httpтАж  1074 VictтАж Male   IronboтАж In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#>  4 httpтАж  1109 Will  Male   ""      ""    In 2тАж FALSE <chr тАж <chr [тАж ""    
#>  5 httpтАж  1166 AreoтАж Male   NorvosтАж In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#>  6 httpтАж  1267 Chett Male   ""      At HтАж In 2тАж FALSE <chr тАж <chr [тАж ""    
#>  7 httpтАж  1295 CresтАж Male   ""      In 2тАж In 2тАж FALSE <chr тАж <chr [тАж ""    
#>  8 httpтАж   130 AriaтАж Female Dornish In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#>  9 httpтАж  1303 DaenтАж Female ValyriтАж In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#> 10 httpтАж  1319 DavoтАж Male   WesterтАж In 2тАж ""    TRUE  <chr тАж <chr [тАж ""    
#> # тАж with 20 more rows, and 7 more variables: mother <chr>, spouse <chr>,
#> #   allegiances <list>, books <list>, povBooks <list>, tvSeries <list>,
#> #   playedBy <list>

рд╕рдВрд░рдЪрдирд╛ got_chars рднрдиреНрджрд╛ рдЕрд▓рд┐ рдЧрд╛рд╣реНрд░реЛ gh_users, рдХрд┐рдирднрдиреЗ рдХреЗрд╣реА рд╕реВрдЪреА рдШрдЯрдХрд╣рд░реВ char рдЖрдлреИрдВ рдПрдХ рд╕реВрдЪреА рд╣реЛ, рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛ рд╣рд╛рдореАрд▓реЗ рд╕реНрддрдореНрднрд╣рд░реВ рдкрд╛рдЙрдБрдЫреМрдВ - рд╕реВрдЪреАрд╣рд░реВ:

chars2 %>% select_if(is.list)
#> # A tibble: 30 x 7
#>    titles    aliases    allegiances books     povBooks  tvSeries  playedBy 
#>    <list>    <list>     <list>      <list>    <list>    <list>    <list>   
#>  1 <chr [3]> <chr [4]>  <chr [1]>   <chr [3]> <chr [2]> <chr [6]> <chr [1]>
#>  2 <chr [2]> <chr [11]> <chr [1]>   <chr [2]> <chr [4]> <chr [6]> <chr [1]>
#>  3 <chr [2]> <chr [1]>  <chr [1]>   <chr [3]> <chr [2]> <chr [1]> <chr [1]>
#>  4 <chr [1]> <chr [1]>  <???>       <chr [1]> <chr [1]> <chr [1]> <chr [1]>
#>  5 <chr [1]> <chr [1]>  <chr [1]>   <chr [3]> <chr [2]> <chr [2]> <chr [1]>
#>  6 <chr [1]> <chr [1]>  <???>       <chr [2]> <chr [1]> <chr [1]> <chr [1]>
#>  7 <chr [1]> <chr [1]>  <???>       <chr [2]> <chr [1]> <chr [1]> <chr [1]>
#>  8 <chr [1]> <chr [1]>  <chr [1]>   <chr [4]> <chr [1]> <chr [1]> <chr [1]>
#>  9 <chr [5]> <chr [11]> <chr [1]>   <chr [1]> <chr [4]> <chr [6]> <chr [1]>
#> 10 <chr [4]> <chr [5]>  <chr [2]>   <chr [1]> <chr [3]> <chr [5]> <chr [1]>
#> # тАж with 20 more rows

рддрдкрд╛рдИрдВрдХреЛ рдердк рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рдХреНрд╖реНрдпрд╣рд░реВрдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред рд╕рд╛рдпрдж рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХ рд░ рд╢реГрдЩреНрдЦрд▓рд╛рдХреЛ рд▓рд╛рдЧрд┐ рд░реЗрдЦрд╛рд╣рд░реВрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рд░рд╛рдЦреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬрд╕рдорд╛ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ рджреЗрдЦрд┐рдиреНрдЫ:

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            
#>    <chr>            <chr>    <chr>            
#>  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
#> # тАж with 170 more rows

рд╡рд╛ рд╣реБрдирд╕рдХреНрдЫ рддрдкрд╛рдЗрдБ рдПрдЙрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ рд░ рдХрд╛рдорд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреЗ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ:

chars2 %>% 
  select(name, title = titles) %>% 
  unnest_longer(title)
#> # A tibble: 60 x 2
#>    name              title                                               
#>    <chr>             <chr>                                               
#>  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             ""                                                  
#> # тАж with 50 more rows

(рдЦрд╛рд▓реА рдорд╛рдирд╣рд░реВ рдиреЛрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН "" рдХреНрд╖реЗрддреНрд░ рдорд╛ title, рдпреЛ рдбрд╛рдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрджрд╛ рднрдПрдХреЛ рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рдХрд╛рд░рдг рд╣реЛ got_chars: рд╡рд╛рд╕реНрддрд╡рдорд╛, рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЬрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдлрд┐рд▓реНрдбрдорд╛ рдХреБрдиреИ рд╕рдореНрдмрдиреНрдзрд┐рдд рдкреБрд╕реНрддрдХ рд░ рдЯрд┐рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реАрд░реНрд╖рдХрд╣рд░реВ рдЫреИрдирдиреН title рд▓рдореНрдмрд╛рдЗ реж рдХреЛ рднреЗрдХреНрдЯрд░ рд╣реБрдиреБрдкрд░реНрдЫ, рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдЩ рднрдПрдХреЛ рд▓рдореНрдмрд╛рдЗ 0 рдХреЛ рднреЗрдХреНрдЯрд░ рд╣реЛрдЗрдиред)

рд╣рд╛рдореА рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдорд╛рдерд┐рдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреБрди: рд▓реЗрдЦреНрди рд╕рдХреНрдЫреМрдВ unnest_auto()ред рдпреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ-рдкрдЯрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рддрд░ рддрдкрд╛рдИрдВрд▓реЗ рднрд░ рдкрд░реНрдиреБ рд╣реБрдБрджреИрди unnest_auto() рдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ред рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ рдХрд┐ рдпрджрд┐ рддрдкрд╛рдИрдВрдХреЛ рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ unnest_auto() рдпрджрд┐ рдпрд╕рд▓реЗ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд░реВрдкрдорд╛ рд╕реВрдЪреА рд╕реНрддрдореНрднрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВрдорд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдпреЛ рднрдиреЗ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рд╕рдВрдпрдиреНрддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХреНрдЫ unnest_longer(), рддреНрдпрд╕рдкрдЫрд┐ рдЬрдм рдЖрдЧрдорди рдбрд╛рдЯрд╛рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреНрдЫ, рддрд░реНрдХ рдкрдХреНрд╖рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ unnest_wider(), рд░ рдирд┐рд░рдиреНрддрд░ рдЖрдзрд╛рд░рдорд╛ рдпреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирд╛рд▓реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддреНрд░реБрдЯрд┐рд╣рд░реВ рдирд┐рдореНрддреНрдпрд╛рдЙрди рд╕рдХреНрдЫред

tibble(char = got_chars) %>% 
  unnest_auto(char) %>% 
  select(name, title = titles) %>% 
  unnest_auto(title)
#> Using `unnest_wider(char)`; elements have 18 names in common
#> Using `unnest_longer(title)`; no element has names
#> # A tibble: 60 x 2
#>    name              title                                               
#>    <chr>             <chr>                                               
#>  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             ""                                                  
#> # тАж with 50 more rows

рдЧреБрдЧрд▓рд╕рдБрдЧ рдЬрд┐рдпреЛрдХреЛрдбрд┐рдЩ

рдЕрд░реНрдХреЛ, рд╣рд╛рдореА Google рдХреЛ рдЬрд┐рдпреЛрдХреЛрдбрд┐рдЩ рд╕реЗрд╡рд╛рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдбрд╛рдЯрд╛рдХреЛ рдердк рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВред рдХреНрдпрд╛рд╕рд┐рдЩ рдкреНрд░рдорд╛рдгрд╣рд░реВ рдЧреБрдЧрд▓ рдирдХреНрд╕рд╛ рдПрдкреАрдЖрдИрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдирд┐рдпрдорд╣рд░реВ рд╡рд┐рд░реБрджреНрдз рд╣реЛ, рддреНрдпрд╕реИрд▓реЗ рдо рдкрд╣рд┐рд▓реЗ рдПрдкреАрдЖрдИ рд╡рд░рд┐рдкрд░рд┐ рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рд░реНрдпрд╛рдкрд░ рд▓реЗрдЦреНрдиреЗрдЫреБред рдЬреБрди рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░рдорд╛ Google рдирдХреНрд╕рд╛ API рдХреБрдЮреНрдЬреА рднрдгреНрдбрд╛рд░рдгрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫ; рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рддрдкрд╛рдЗрдБрдХреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░рд╣рд░реВрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ Google рдирдХреНрд╕рд╛ API рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреБрдЮреНрдЬреА рдЫреИрди рднрдиреЗ, рдпрд╕ рдЦрдгреНрдбрдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рдЯреБрдХреНрд░рд╛рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗ рдЫреИрдиред

has_key <- !identical(Sys.getenv("GOOGLE_MAPS_API_KEY"), "")
if (!has_key) {
  message("No Google Maps API key found; code chunks will not be run")
}

# 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)
}

рдпрд╕ рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдлрд░реНрдХрд╛рдЙрдиреЗ рд╕реВрдЪреА рдПрдХрджрдо рдЬрдЯрд┐рд▓ рдЫ:

houston <- geocode("Houston TX")
str(houston)
#> List of 2
#>  $ results:List of 1
#>   ..$ :List of 5
#>   .. ..$ address_components:List of 4
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Houston"
#>   .. .. .. ..$ short_name: chr "Houston"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "locality"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Harris County"
#>   .. .. .. ..$ short_name: chr "Harris County"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "administrative_area_level_2"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "Texas"
#>   .. .. .. ..$ short_name: chr "TX"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "administrative_area_level_1"
#>   .. .. .. .. ..$ : chr "political"
#>   .. .. ..$ :List of 3
#>   .. .. .. ..$ long_name : chr "United States"
#>   .. .. .. ..$ short_name: chr "US"
#>   .. .. .. ..$ types     :List of 2
#>   .. .. .. .. ..$ : chr "country"
#>   .. .. .. .. ..$ : chr "political"
#>   .. ..$ formatted_address : chr "Houston, TX, USA"
#>   .. ..$ geometry          :List of 4
#>   .. .. ..$ bounds       :List of 2
#>   .. .. .. ..$ northeast:List of 2
#>   .. .. .. .. ..$ lat: num 30.1
#>   .. .. .. .. ..$ lng: num -95
#>   .. .. .. ..$ southwest:List of 2
#>   .. .. .. .. ..$ lat: num 29.5
#>   .. .. .. .. ..$ lng: num -95.8
#>   .. .. ..$ location     :List of 2
#>   .. .. .. ..$ lat: num 29.8
#>   .. .. .. ..$ lng: num -95.4
#>   .. .. ..$ location_type: chr "APPROXIMATE"
#>   .. .. ..$ viewport     :List of 2
#>   .. .. .. ..$ northeast:List of 2
#>   .. .. .. .. ..$ lat: num 30.1
#>   .. .. .. .. ..$ lng: num -95
#>   .. .. .. ..$ southwest:List of 2
#>   .. .. .. .. ..$ lat: num 29.5
#>   .. .. .. .. ..$ lng: num -95.8
#>   .. ..$ place_id          : chr "ChIJAYWNSLS4QIYROwVl894CDco"
#>   .. ..$ types             :List of 2
#>   .. .. ..$ : chr "locality"
#>   .. .. ..$ : chr "political"
#>  $ status : chr "OK"

рд╕реМрднрд╛рдЧреНрдпрд╡рд╢, рд╣рд╛рдореА рдпрд╕ рдбреЗрдЯрд╛рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЪрд░рдгрдмрджреНрдз рд░реВрдкрдорд╛ рддрд╛рд▓рд┐рдХрд╛ рдлрд╛рд░рдордорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ tidyrред рдХрд╛рд░реНрдпрд▓рд╛рдИ рдЕрд▓рд┐ рдмрдвреА рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд░ рдпрдерд╛рд░реНрдердкрд░рдХ рдмрдирд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рдХреЗрд╣реА рд╢рд╣рд░рд╣рд░реВ рдЬрд┐рдпреЛрдХреЛрдбрд┐рдЩ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреБ:

  city <-   c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" )  city_geo <-   purrr::map (city, geocode) 

рдо рдирддрд┐рдЬрд╛рдорд╛ рдкрд░рд┐рдгрдд рдЧрд░реНрдиреЗрдЫреБ tibble, рд╕реБрд╡рд┐рдзрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдо рд╕рдореНрдмрдиреНрдзрд┐рдд рд╢рд╣рд░рдХреЛ рдирд╛рдордХреЛ рд╕рд╛рде рд╕реНрддрдореНрдн рдердкреНрдиреЗрдЫреБред

loc <- tibble(city = city, json = city_geo)
loc
#> # A tibble: 5 x 2
#>   city        json            
#>   <chr>       <list>          
#> 1 Houston     <named list [2]>
#> 2 LA          <named list [2]>
#> 3 New York    <named list [2]>
#> 4 Chicago     <named list [2]>
#> 5 Springfield <named list [2]>

рдкрд╣рд┐рд▓реЛ рд╕реНрддрд░рдорд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдЫрдиреН status ╨╕ resultрдЬрд╕рд▓рд╛рдИ рд╣рд╛рдореА рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ unnest_wider() :

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

рддреНрдпреЛ рдиреЛрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН results рдмрд╣реБ-рд╕реНрддрд░реАрдп рд╕реВрдЪреА рд╣реЛред рдзреЗрд░реИрдЬрд╕реЛ рд╢рд╣рд░рд╣рд░реВрдорд╛ 1 рддрддреНрд╡рд╣рд░реВ рдЫрдиреН (рдЬрд┐рдпреЛрдХреЛрдбрд┐рдЩ API рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЕрджреНрд╡рд┐рддреАрдп рдорд╛рдирдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ), рддрд░ рд╕реНрдкреНрд░рд┐рдЩрдлрд┐рд▓реНрдбрдорд╛ рджреБрдИрд╡рдЯрд╛ рдЫрдиреНред рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрд▓рдЧ рд▓рд╛рдЗрдирд╣рд░реВрдорд╛ рддрд╛рдиреНрди рд╕рдХреНрдЫреМрдВ unnest_longer() :

loc %>%
  unnest_wider(json) %>% 
  unnest_longer(results)
#> # A tibble: 5 x 3
#>   city        results          status
#>   <chr>       <list>           <chr> 
#> 1 Houston     <named list [5]> OK    
#> 2 LA          <named list [5]> OK    
#> 3 New York    <named list [5]> OK    
#> 4 Chicago     <named list [5]> OK    
#> 5 Springfield <named list [5]> 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
#>   <chr>  <list>            <chr>            <list>   <chr>     <lis> <chr> 
#> 1 HoustтАж <list [4]>        Houston, TX, USA <named тАж ChIJAYWNтАж <lisтАж OK    
#> 2 LA     <list [4]>        Los Angeles, CAтАж <named тАж ChIJE9onтАж <lisтАж OK    
#> 3 New YтАж <list [3]>        New York, NY, UтАж <named тАж ChIJOwg_тАж <lisтАж OK    
#> 4 ChicaтАж <list [4]>        Chicago, IL, USA <named тАж ChIJ7cv0тАж <lisтАж OK    
#> 5 SprinтАж <list [5]>        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
#>   <chr> <list>           <chr>            <list> <list>   <chr>        
#> 1 HousтАж <list [4]>       Houston, TX, USA <nameтАж <named тАж APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAтАж <nameтАж <named тАж APPROXIMATE  
#> 3 New тАж <list [3]>       New York, NY, UтАж <nameтАж <named тАж APPROXIMATE  
#> 4 ChicтАж <list [4]>       Chicago, IL, USA <nameтАж <named тАж APPROXIMATE  
#> 5 SpriтАж <list [5]>       Springfield, MOтАж <nameтАж <named тАж APPROXIMATE  
#> # тАж with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╕реНрдерд╛рди рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдЗрдБ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ 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
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 HousтАж <list [4]>       Houston, TX, USA <nameтАж  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAтАж <nameтАж  34.1 -118.  APPROXIMATE  
#> 3 New тАж <list [3]>       New York, NY, UтАж <nameтАж  40.7  -74.0 APPROXIMATE  
#> 4 ChicтАж <list [4]>       Chicago, IL, USA <nameтАж  41.9  -87.6 APPROXIMATE  
#> 5 SpriтАж <list [5]>       Springfield, MOтАж <nameтАж  37.2  -93.3 APPROXIMATE  
#> # тАж with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

рдлреЗрд░рд┐ рдкрдирд┐, 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
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 HousтАж <list [4]>       Houston, TX, USA <nameтАж  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAтАж <nameтАж  34.1 -118.  APPROXIMATE  
#> 3 New тАж <list [3]>       New York, NY, UтАж <nameтАж  40.7  -74.0 APPROXIMATE  
#> 4 ChicтАж <list [4]>       Chicago, IL, USA <nameтАж  41.9  -87.6 APPROXIMATE  
#> 5 SpriтАж <list [5]>       Springfield, MOтАж <nameтАж  37.2  -93.3 APPROXIMATE  
#> # тАж with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

рд╣рд╛рдореА рдкреНрд░рддреНрдпреЗрдХ рд╢рд╣рд░рдХреЛ рд▓рд╛рдЧрд┐ рдкрд╣рд┐рд▓реЛ рдареЗрдЧрд╛рдирд╛ рдкрдирд┐ рд╣реЗрд░реНрди рд╕рдХреНрдЫреМрдВ:

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
#>   <chr> <list>           <chr>            <list> <dbl>  <dbl> <chr>        
#> 1 HousтАж <list [4]>       Houston, TX, USA <nameтАж  29.8  -95.4 APPROXIMATE  
#> 2 LA    <list [4]>       Los Angeles, CAтАж <nameтАж  34.1 -118.  APPROXIMATE  
#> 3 New тАж <list [3]>       New York, NY, UтАж <nameтАж  40.7  -74.0 APPROXIMATE  
#> 4 ChicтАж <list [4]>       Chicago, IL, USA <nameтАж  41.9  -87.6 APPROXIMATE  
#> 5 SpriтАж <list [5]>       Springfield, MOтАж <nameтАж  37.2  -93.3 APPROXIMATE  
#> # тАж with 4 more variables: viewport <list>, place_id <chr>, types <list>,
#> #   status <chr>

рд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН 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            
#>   <chr>       <dbl>  <dbl> <list>          
#> 1 Houston      29.8  -95.4 <named list [2]>
#> 2 LA           34.1 -118.  <named list [2]>
#> 3 New York     40.7  -74.0 <named list [2]>
#> 4 Chicago      41.9  -87.6 <named list [2]>
#> 5 Springfield  37.2  -93.3 <named list [2]>

Sharla Gelfand рдХреЛ рдбрд┐рд╕реНрдХреЛрдЧреНрд░рд╛рдлреА

рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рд╕рдмреИрднрдиреНрджрд╛ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реЗрд░реНрдиреЗрдЫреМрдВ - Sharla Gelfand рдХреЛ рдбрд┐рд╕реНрдХреЛрдЧреНрд░рд╛рдлреАред рдорд╛рдерд┐рдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдЬрд╕реНрддреИ, рд╣рд╛рдореА рд╕реВрдЪреАрд▓рд╛рдИ рдПрдХрд▓-рд╕реНрддрдореНрдн рдбрд╛рдЯрд╛ рдлреНрд░реЗрдордорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрдЫреМрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рдЫреБрдЯреНрдЯреИ рд╕реНрддрдореНрдн рд╣реЛрд╕реНред рдо рдкрдирд┐ рд╕реНрддрдореНрдн рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдЫреБ date_added R рдорд╛ рдЙрдкрдпреБрдХреНрдд рдорд┐рддрд┐ рд░ рд╕рдордп рдврд╛рдБрдЪрд╛рдорд╛ред

discs <- tibble(disc = discog) %>% 
  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
#>          <int> <dttm>              <list>               <int>  <int>
#>  1   354823933 2019-02-16 17:48:59 <named list [11]>  7496378      0
#>  2   354092601 2019-02-13 14:13:11 <named list [11]>  4490852      0
#>  3   354091476 2019-02-13 14:07:23 <named list [11]>  9827276      0
#>  4   351244906 2019-02-02 11:39:58 <named list [11]>  9769203      0
#>  5   351244801 2019-02-02 11:39:37 <named list [11]>  7237138      0
#>  6   351052065 2019-02-01 20:40:53 <named list [11]> 13117042      0
#>  7   350315345 2019-01-29 15:48:37 <named list [11]>  7113575      0
#>  8   350315103 2019-01-29 15:47:22 <named list [11]> 10540713      0
#>  9   350314507 2019-01-29 15:44:08 <named list [11]> 11260950      0
#> 10   350314047 2019-01-29 15:41:35 <named list [11]> 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":

discs %>% unnest_wider(basic_information, names_repair = "unique")
#> New names:
#> * id -> id...6
#> * id -> id...14
#> # A tibble: 155 x 15
#>    instance_id date_added          labels  year artists id...6 thumb title
#>          <int> <dttm>              <list> <int> <list>   <int> <chr> <chr>
#>  1   354823933 2019-02-16 17:48:59 <listтАж  2015 <list тАж 7.50e6 httpтАж Demo 
#>  2   354092601 2019-02-13 14:13:11 <listтАж  2013 <list тАж 4.49e6 httpтАж ObseтАж
#>  3   354091476 2019-02-13 14:07:23 <listтАж  2017 <list тАж 9.83e6 httpтАж I    
#>  4   351244906 2019-02-02 11:39:58 <listтАж  2017 <list тАж 9.77e6 httpтАж O├нdoтАж
#>  5   351244801 2019-02-02 11:39:37 <listтАж  2015 <list тАж 7.24e6 httpтАж A CaтАж
#>  6   351052065 2019-02-01 20:40:53 <listтАж  2019 <list тАж 1.31e7 httpтАж TashтАж
#>  7   350315345 2019-01-29 15:48:37 <listтАж  2014 <list тАж 7.11e6 httpтАж Demo 
#>  8   350315103 2019-01-29 15:47:22 <listтАж  2015 <list тАж 1.05e7 httpтАж Let тАж
#>  9   350314507 2019-01-29 15:44:08 <listтАж  2017 <list тАж 1.13e7 ""    Sub тАж
#> 10   350314047 2019-01-29 15:41:35 <listтАж  2017 <list тАж 1.17e7 httpтАж Demo 
#> # тАж with 145 more rows, and 7 more variables: formats <list>,
#> #   cover_image <chr>, resource_url <chr>, master_id <int>,
#> #   master_url <chr>, id...14 <int>, rating <int>

рд╕рдорд╕реНрдпрд╛ рдпрд╣реА рд╣реЛ basic_information рдЖрдИрдбреА рд╕реНрддрдореНрдн рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрдЫ рдЬреБрди рд╢реАрд░реНрд╖ рд╕реНрддрд░рдорд╛ рдкрдирд┐ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╣рдЯрд╛рдЙрди рд╕рдХреНрдЫреМрдВ:

discs %>% 
  select(-id) %>% 
  unnest_wider(basic_information)
#> # A tibble: 155 x 14
#>    instance_id date_added          labels  year artists     id thumb title
#>          <int> <dttm>              <list> <int> <list>   <int> <chr> <chr>
#>  1   354823933 2019-02-16 17:48:59 <listтАж  2015 <list тАж 7.50e6 httpтАж Demo 
#>  2   354092601 2019-02-13 14:13:11 <listтАж  2013 <list тАж 4.49e6 httpтАж ObseтАж
#>  3   354091476 2019-02-13 14:07:23 <listтАж  2017 <list тАж 9.83e6 httpтАж I    
#>  4   351244906 2019-02-02 11:39:58 <listтАж  2017 <list тАж 9.77e6 httpтАж O├нdoтАж
#>  5   351244801 2019-02-02 11:39:37 <listтАж  2015 <list тАж 7.24e6 httpтАж A CaтАж
#>  6   351052065 2019-02-01 20:40:53 <listтАж  2019 <list тАж 1.31e7 httpтАж TashтАж
#>  7   350315345 2019-01-29 15:48:37 <listтАж  2014 <list тАж 7.11e6 httpтАж Demo 
#>  8   350315103 2019-01-29 15:47:22 <listтАж  2015 <list тАж 1.05e7 httpтАж Let тАж
#>  9   350314507 2019-01-29 15:44:08 <listтАж  2017 <list тАж 1.13e7 ""    Sub тАж
#> 10   350314047 2019-01-29 15:41:35 <listтАж  2017 <list тАж 1.17e7 httpтАж Demo 
#> # тАж with 145 more rows, and 6 more variables: formats <list>,
#> #   cover_image <chr>, resource_url <chr>, master_id <int>,
#> #   master_url <chr>, rating <int>

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдкрдорд╛, рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ hoist():

discs %>% 
  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
#>          <int> <dttm>              <chr> <int> <chr> <chr> 
#>  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тАж
#> # тАж with 145 more rows, and 3 more variables: basic_information <list>,
#> #   id <int>, rating <int>

рдпрд╣рд╛рдБ рдо рдиреЗрд╕реНрдЯреЗрдб рд╕реВрдЪреАрдорд╛ рдбрд╛рдЗрднрд┐рдЩ рдЧрд░реЗрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рджреНрд╡рд╛рд░рд╛ рдкрд╣рд┐рд▓реЛ рд▓реЗрдмрд▓ рд░ рдХрд▓рд╛рдХрд╛рд░рдХреЛ рдирд╛рдо рджреНрд░реБрдд рд░реВрдкрдорд╛ рдкреБрдирдГрдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреБред

рдердк рд╡реНрдпрд╡рд╕реНрдерд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд▓рд╛рдХрд╛рд░ рд░ рд▓реЗрдмрд▓рдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рд╣реЛ:

discs %>% 
  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
#>       <int> <chr> <chr>       <chr> <chr>  <chr> <chr>                <int>
#>  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
#> # тАж with 157 more rows

discs %>% 
  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  
#>       <int> <chr>        <chr> <chr>    <chr>
#>  1  7496378 Numbered     Black Cassette 1    
#>  2  4490852 LP           <NA>  Vinyl    1    
#>  3  9827276 "7""        <NA>  Vinyl    1    
#>  4  9827276 45 RPM       <NA>  Vinyl    1    
#>  5  9827276 EP           <NA>  Vinyl    1    
#>  6  9769203 LP           <NA>  Vinyl    1    
#>  7  9769203 Album        <NA>  Vinyl    1    
#>  8  7237138 "7""        <NA>  Vinyl    1    
#>  9  7237138 45 RPM       <NA>  Vinyl    1    
#> 10 13117042 "7""        <NA>  Vinyl    1    
#> # тАж with 270 more rows

рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд░реВрдкрдорд╛ рдореВрд▓ рдбреЗрдЯрд╛рд╕реЗрдЯрдорд╛ рдЬреЛрдбреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ рдореВрд▓ рднрд╛рдЧрдорд╛ tidyverse рдзреЗрд░реИ рдЙрдкрдпреЛрдЧреА рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдПрдХ рд╕рд╛рдЭрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╢реЛрдзрди рджрд░реНрд╢рдирджреНрд╡рд╛рд░рд╛ рдПрдХрдЬреБрдЯ рд╣реБрдиреНрдЫрдиреНред

рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рдкрд░рд┐рд╡рд╛рд░рдХреЛ рдЬрд╛рдБрдЪ рдЧрд░реНрдпреМрдВ unnest_*(), рдЬрд╕рдХреЛ рдЙрджреНрджреЗрд╢реНрдп рдиреЗрд╕реНрдЯреЗрдб рд╕реВрдЪреАрд╣рд░реВрдмрд╛рдЯ рддрддреНрд╡рд╣рд░реВ рдирд┐рдХрд╛рд▓реНрдиреЗрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рд╣реЛред рдпреЛ рдкреНрдпрд╛рдХреЗрдЬрд▓реЗ рдзреЗрд░реИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЕрдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрдЫ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдбрд╛рдЯрд╛.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди