ááá á¹á á¡áá»á¬ážá á¯ááœááºá API áá áºáá¯ááŸáááŸááá±á¬ áá¯á¶á·ááŒááºááŸá¯áá áºáᯠááá¯á·ááá¯áẠááŸá¯ááºááœá±ážáá±á¬áá áºáááºááœá²á·á ááºážáá¯á¶áá«ááŸááá±á¬ á¡ááŒá¬ážáá±áá¬áá áºáá¯áá¯ááŒáá·áº áá¯ááºáá±á¬ááºáá±á¬á¡áá«á áááºááẠJSON ááŸáá·áº XML áá±á¬áºáááºáá»á¬ážááŸáá·áº áááºááá¯ááºáááá¯ááºáááºá
á€áá±á¬áºáááºáá»á¬ážááẠá¡á¬ážáá¬áá»ááºáá»á¬ážá áœá¬ááŸááááº- áááºážááá¯á·ááẠáá±áá¬ááᯠá¡áá±á¬áºáá±áž áá»á áºáá»á áºáá»á áºáá»á Ạááááºážáááºážáá¬ážááŒá®áž áááá¯á¡ááºáá±á¬ á¡áá»ááºá¡áááºáá»á¬áž áááºááœá¬ážááŒááºážááᯠááŸá±á¬ááºááŸá¬ážááá¯ááºá á±áá«áááºá
á€áá±á¬áºáááºáá»á¬ážá á¡á¬ážáááºážáá»ááºááŸá¬ áááºážááá¯á·á áá¯ááºáá±á¬ááºááŸá¯ááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á ááŸá¯ááºááœá±ážááŸá¯ááŒá áºáááºá ááœá²á·á ááºážáá¯á¶áááŸááá±á¬áá±áá¬ááᯠááœááºáá»ááºááŸá¯áá»á¬ážááœáẠá¡áá¯á¶ážáááŒá¯ááá¯ááºááá·áºá¡ááŒáẠáááºážááœáẠáá¯á¶áá±á¬áºááŒááºážááá¯áááºáž áááºáá±á¬ááºááááá«á
á€áá±á¬ááºážáá«ážááẠáá¯ááºáá±ááŸá¯á áá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºáá±á¬ á¡áááºááŒá
áºáááºá tidyr
á
á¬ááŒáá·áºááá¯ááºá á¡á°ááá¯ááºááœáẠáá«áááºáááºá tidyverse
ááŸáá·áºáááºážááá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááááá¬ážá
ᯠunnest_*()
.
á¡ááŒá±á¬ááºážá¡áá¬
áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááᯠá
áááºáááºá
á¬ážáá«á áá»áœááºá¯ááºááᯠá
áááºáááºá
á¬ážáá±áááºá
áááá«ááºáž GitHub á¡áá¯á¶ážááŒá¯áá°áá»á¬áž Github ááá¯ááŸá±á¬ááºááŸá¯áá»á¬áž Game of Thrones áá¬ááºáá±á¬áẠGoogle ááŒáá·áº Geocoding Sharla Gelfand á ááŸááºážáááºážáá»áẠáá±á¬ááºáá»ááº
áááá«ááºáž
á
áá¯áá¶áá¯á¶ (áá¬áá¬ááŒááºáá°áááŸááºáá»ááºá á€á¡áá¯á¶ážá¡ááŸá¯ááºážá¡ááœáẠáá¯á¶áá±á¬ááºáá±á¬áá¬áá¬ááŒááºááœá±ážáá»ááºá
áá¬áá»á¬ážááᯠáá»áœááºá¯ááºáááœá±á·áá±á¬ááŒá±á¬áá·áº áááºážááá¯áá¬ážáá²á·áá«áááºá) áááºážááŸá®ážáá±á¬á¡áááºážáá»á¬ážááŸáá·áº áá±á¬áºáá¶áá»á¬ážáá«ááŸááá±á¬ ááŸá
áºáááºááŒááºááá¬ážáá
áºáá¯ááá¯á· nested arrays áá»á¬ážááŒáá·áº ááœá²á·á
ááºážáááºáá±á¬ááºáá¯á¶ááá¬ážáá±á¬áá±áá¬ááᯠáá°áá±á¬ááºááŒááºážáá¯ááºáááºážá
ááºááŒá
áºáááºá IN tidyr
nested list áá±á¬áºáá¶áá»á¬ážááᯠáá»á²á·ááœááºááŒá®áž áá±áá¬ááᯠá
áá¯áá¶áá¯á¶á
á¶á ááá¬ážáá¯á¶á
á¶ááá¯á· áá»áŸá±á¬á·áá»ááẠáá°áá®áá±ážááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá
áœá¬ ááŸááá«áááºá
unnest_longer()
áá±á¬áºáá¶á á¬áááºážáááŒááºá ááºáá áºáá¯á á®ááá¯áá°áᬠá¡áááºážá¡áá áºáá áºáá¯áááºáá®ážáá«áunnest_wider()
áá±á¬áºáá¶á á¬áááºážáááŒááºá ááºáá áºáá¯á á®ááá¯áá°á áá±á¬áºáá¶á¡áá áºáá áºáá¯áááºáá®ážáá«áunnest_auto()
áááºááá·áºáá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯ááẠá¡áá±á¬ááºážáá¯á¶ážááᯠá¡ááá¯á¡áá»á±á¬áẠáá¯á¶ážááŒááºáá±ážáááºá
unnest_longer()
ááá¯á·ááá¯ááºunnest_wider()
.hoist()
á¡áá¬ážáá°unnest_wider()
ááá¯á·áá±á¬áº áááºááŸááºáá¬ážáá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬ážááá¯áᬠááœá±ážáá»ááºááŒá®áž nesting á¡ááá·áºáá»á¬ážá áœá¬ááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáááºá
ááŸá áºáááºááŒááºááá¬ážáá áºáá¯ááá¯á· á¡ááá¯ááºá¡ááŒá¯ááºá¡ááá·áºáá»á¬ážá áœá¬ááŒáá·áº ááœá²á·á ááºážáááºáá±á¬ááºáá¯á¶ááá¬ážáá±á¬áá±áá¬ááᯠáá°áá±á¬ááºáá¬ááŒááºážááŸáá·áºáááºá ááºáá±áá±á¬ ááŒá¿áá¬á¡áá»á¬ážá á¯ááᯠdplyr ááŸáá·áº á á¬áááºážááŒá¯á á¯áá¬ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá±á«ááºážá ááºááŒááºážááŒáá·áº ááŒá±ááŸááºážááá¯ááºáá«áááºá
á€áááºážááá¬áá»á¬ážááᯠááá¯ááºááŒáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¯ááºááᯠá¡áá¯á¶ážááŒá¯áá«áááºá repurrrsive
ááẠAPI áá
áºáá¯á០áááºážáááºáá¬áá±á¬ ááŸá¯ááºááœá±ážááŒá®áž á¡ááá·áºáá±á«ááºážáá»á¬ážá
áœá¬ á
á¬áááºážáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá±á¬á
library(tidyr)
library(dplyr)
library(repurrrsive)
GitHub á¡áá¯á¶ážááŒá¯áá°áá»á¬áž
á¡áá°á ááẠgh_á¡áá¯á¶ážááŒá¯áá°áá»á¬ážGitHub á¡áá¯á¶ážááŒá¯áá° ááŒá±á¬ááºáŠážááŸáá·áºáááºáááºáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážáá«ááŸááá±á¬ á á¬áááºážá á¡áááºáá¯á¶áž á á¬áááºážááᯠá¡ááœááºááŒá±á¬ááºážááŒáá·áºáá¡á±á¬áẠgh_á¡áá¯á¶ážááŒá¯áá°áá»á¬áž в áá¯áẠáá±á¬ááº-
users <- tibble( user = gh_users )
áááºážááẠá¡áááºážááẠáááºááŒááºáááºáá±á¬ááºáá¯á¶ááááº- á¡áááºááŒá±á¬áá·áº á á¬áááºážáá±ážááááºážá gh_á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áá±áá¬ááœá²á·á ááºážáá¯á¶ááá¯á·? ááá¯á·áá±á¬áº áá±áá¬áá±á¬ááºáá áºáá¯ááœáẠááŒá®ážáá¬ážáá±á¬á¡á¬ážáá¬áá»ááºáá áºáá¯ááŸááááº- áááºážááẠvector á¡áá»á¬ážá¡ááŒá¬ážááá¯áá±á«ááºážá ááºáá¬ážáá±á¬ááŒá±á¬áá·áº á¡áá¬áááºááááºážááᯠá¡áá¬ááá¹áá¯áá áºáá¯áááºážááœáẠááŒá±áá¬áá¶ááá¯ááºáááºááŒá áºáááºá
á¡áá¬ááá¹áá¯áá
áºáá¯á
á® 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()
áá°áá®áá±á¬ syntax ááᯠá¡áá¯á¶ážááŒá¯á ááœá±ážáá»ááºáá¬ážáá±á¬ á¡á
áááºá¡ááá¯ááºážáá»á¬ážááᯠáá¯ááºáá°ááá¯ááºá
á±áá«áááºá 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]>
áá®áá
áºáá«áá±á¬á· ááŒááºá
áẠá¡áá¯á¶ážááŒá¯áá°ááᯠá€á¡áá¯á¶ážááŒá¯áá°ááá¯ááºááá¯ááºáá±á¬ ááá¯ááŸá±á¬ááºáááºážáá»á¬ážá
á¬áááºážááᯠááá¯ááºá
á¬ážááŒá¯áááºá repository áá
áºáá¯á
á®ááẠáá®ážááŒá¬ážáá±á·áá¬áá»ááºáá
áºáá¯ááŒá
áºáá±á¬ááŒá±á¬áá·áº áááºáááºáá±á¬ data áááá±á¬ááá¬ážá¡ááá¯ááºážááŒá
áºáááºá (á¡áá®ážá
ááºáá¯á¶áž áááºáááºáá±á¬ á¡áá»ááºá¡áááº) áááºážááá¯á·ááẠááá¯ááºážá¡áá
áºáá»á¬ážááŒá
áºáá¬ááá·áºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áááŒááºážááŒá
áºáá«áááºá 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")
: áááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž nested list áá
áºáá¯á០áá¯áááá¡ááá·áºáááºááá¯ážááᯠáááŸáá
á±áá«áááºá owner
. á¡ááŒá¬ážáááºážáááºážáá
áºáá¯ááẠá
á¬áááºážáá
áºáá¯áá¯á¶ážááᯠááá°áááºááŒá
áºáááºá owner
ááá¯á·áá±á¬áẠfunction ááá¯á¡áá¯á¶ážááŒá¯áá«á 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()
. á€áá¯ááºáá±á¬ááºáá»ááºááẠáá±áá¬ááá¯ááŒá±á¬ááºážáá²áááºá¡ááœáẠá¡ááá·áºáá±á¬áºáá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºááá¯ááœá±ážáá»ááºáááºá¡ááœáẠheuristic áááºážáááºážáá»á¬ážá
áœá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒá®áž ááœá±ážáá»ááºáá¬ážáá±á¬áááºážáááºážá¡ááŒá±á¬ááºáž áááºáá±á·áá»áºááᯠááŒááá±ážáá«áááºá
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>
Game of Thrones áá¬ááºáá±á¬ááº
got_chars
áá°áá®áá±á¬ááœá²á·á
ááºážáá¯á¶ááŸááááºá gh_users
: áááºážááẠGame of Thrones áá¬ááºáá±á¬ááºá á¡áááºá¡áá»ááºážá¡áá»áá¯á·ááᯠáá±á¬áºááŒáá¬ážááá·áº á¡ááœááºážááá¯ááºážá
á¬áááºážá á¡á
áááºá¡ááá¯ááºážáá
áºáá¯á
á®ááœáẠá¡áááºáá±ážáá¬ážáá±á¬á
á¬áááºážáá»á¬ážááŒá
áºáááºá áá°áá±á¬ááºáá¬áááºá 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 á vector áá
áºáá¯ááŸáááááºá á¡ááŸáẠ1 á vector ááá¯ááºáá² string á¡ááœááºáá«ááŸááááºá)
áá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯á¶ážááŒá¯á á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááᯠáá»áœááºá¯ááºááá¯á· ááŒááºáááºáá±ážáá¬ážááá¯ááºáá«áááºá 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 ááŒáá·áº Geocoding
ááá¯á·áá±á¬ááºá Google á geocoding áááºáá±á¬ááºááŸá¯ááŸáááŸááá±á¬ áá±áá¬áá»á¬ážá ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬ ááœá²á·á ááºážáá¯á¶ááᯠááŒáá·áºáá«áááºá Caching credentials áá»á¬ážááẠGoogle maps API ááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážá á ááºážáá»ááºážáá»á¬ážááᯠááá·áºáá»ááºáá±á¬ááŒá±á¬áá·áº API áááºáááºááœáẠááá¯ážááŸááºážáá±á¬ wrapper áá áºáá¯ááᯠá¡áááºáá±ážáá«áááºá Google Maps API áá±á¬á·ááᯠáááºáááºážáá»áẠááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áá¯á¶á á¶áá áºáá¯ááœáẠááááºážáááºážááŒááºážá¡áá±á«áº á¡ááŒá±áá¶áááºá ááá·áºáááºáááºážáá»ááºááœáẠááááºážáááºážáá¬ážááá·áº Google Maps 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 áá¯ááŸáááẠ(geocoding API ááŸáá·áº áááºááá¯ááºááá·áº áá°ážááŒá¬ážáá±á¬áááºááá¯ážááᯠááá¯ááºá
á¬ážááŒá¯áááº)á ááá¯á·áá±á¬áº Springfield ááœáẠááŸá
áºáá¯ááŸááááºá áá«ááá¯á·áááºáá°ááá¯á·ááá¯áá®ážááŒá¬ážááá¯ááºážáá»á¬ážááŸáá·áºá¡áá°ááœá²áá°ááá¯ááºáá«áááºá 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()
Multi-level dive ááá¯á· ááá¯ááºááá¯ááºááœá¬ážáááºá¡ááœáẠ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
á€á¡ááá·áºááœááºá Sharla á discography ááœáẠdisc áá
áºáá¯á
á®ááᯠááá·áºááá¯ááºááá·áºá¡áá« á¡áá»ááºá¡áááºááᯠáá»áœááºá¯ááºááá¯á·áááŸááá±á¬áºáááºáž ááᯠdiscs áá»á¬ážááŸáá·áºáááºáááºáá±á¬ áááºááá·áºáá±áá¬ááá¯áá»áŸ áá»áœááºá¯ááºááá¯á·áááœá±á·áá«á áá«ááá¯áá¯ááºááá¯á· áá±á¬áºáá¶ááᯠáá»á²á·ááááºá 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_*()
nested lists á០á¡á
áááºá¡ááá¯ááºážáá»á¬ážááᯠáá¯ááºáá°ááŒááºážááŒáá·áº áá¯ááºáá±á¬ááºááẠáááºááœááºáááºá á€áááºáá±á·áá»áºááœáẠá¡áá°á¡áá¡á áá±áá¬ááᯠááá¯ááá¯ááœááºáá°á
áœá¬ ááŒá±á¬ááºážááá¯ááºá
á±ááá·áº á¡ááŒá¬ážá¡áá¯á¶ážáááºáá±á¬ á¡ááºá¹áá«áááºáá»á¬ážá
áœá¬ áá«ááŸááááºá áááºáááºáá±á¬áá±áá¬.
source: www.habr.com