เชจเซ‡เชธเซเชŸเซ‡เชก เช•เซ‰เชฒเชฎเซเชธเชจเซเช‚ เชตเชฟเชธเซเชคเชฐเชฃ - R เชญเชพเชทเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซ‚เชšเชฟเช“ (เชŸเชพเชฏเชฐ เชชเซ‡เช•เซ‡เชœ เช…เชจเซ‡ เช…เชจเชจเซ‡เชธเซเชŸ เชซเซ‡เชฎเชฟเชฒเซ€ เชซเช‚เช•เซเชถเชจเซเชธ)

เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชœเซเชฏเชพเชฐเซ‡ API เชคเชฐเชซเชฅเซ€ เชฎเชณเซ‡เชฒเชพ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชธเชพเชฅเซ‡ เช…เชฅเชตเชพ เชœเชŸเชฟเชฒ เชตเซƒเช•เซเชท เชฎเชพเชณเช–เซเช‚ เชงเชฐเชพเชตเชคเชพ เช…เชจเซเชฏ เช•เซ‹เชˆเชชเชฃ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเชฎเชพเชฐเซ‡ JSON เช…เชจเซ‡ XML เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซ‡ เช›เซ‡.

เช† เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช˜เชฃเชพ เชซเชพเชฏเชฆเชพ เช›เซ‡: เชคเซ‡เช“ เชกเซ‡เชŸเชพเชจเซ‡ เชเช•เชฆเชฎ เชธเช˜เชจ เชฐเซ€เชคเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชจเซ‡ เชฎเชพเชนเชฟเชคเซ€เชจเชพ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชกเซเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชŸเชพเชณเชตเชพ เชฆเซ‡ เช›เซ‡.

เช† เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‹ เช—เซ‡เชฐเชฒเชพเชญ เช เชคเซ‡เชฎเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ€ เชœเชŸเชฟเชฒเชคเชพ เช›เซ‡. เช…เชจเชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชก เชกเซ‡เชŸเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช—เชฃเชคเชฐเซ€เชฎเชพเช‚ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เชฌเชจเชพเชตเซ€ เชถเช•เชพเชคเซเช‚ เชจเชฅเซ€.

เชจเซ‡เชธเซเชŸเซ‡เชก เช•เซ‰เชฒเชฎเซเชธเชจเซเช‚ เชตเชฟเชธเซเชคเชฐเชฃ - R เชญเชพเชทเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเซ‚เชšเชฟเช“ (เชŸเชพเชฏเชฐ เชชเซ‡เช•เซ‡เชœ เช…เชจเซ‡ เช…เชจเชจเซ‡เชธเซเชŸ เชซเซ‡เชฎเชฟเชฒเซ€ เชซเช‚เช•เซเชถเชจเซเชธ)

เช† เชฒเซ‡เช– เชชเซเชฐเช•เชพเชถเชจเชจเซเช‚ เชคเชพเชฐเซเช•เชฟเช• เชšเชพเชฒเซ เช›เซ‡ "เช†เชฐ เชชเซ‡เช•เซ‡เชœ tidyr เช…เชจเซ‡ เชคเซ‡เชจเชพ เชจเชตเชพ เช•เชพเชฐเซเชฏเซ‹ pivot_longer เช…เชจเซ‡ pivot_wider". เชคเซ‡ เชคเชฎเชจเซ‡ เชชเซ‡เช•เซ‡เชœเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชธเช‚เชฐเชšเชฟเชค เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ‡ เชชเชฐเชฟเชšเชฟเชค เช…เชจเซ‡ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชŸเซ‡เชฌเซเชฏเซเชฒเชฐ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฒเชพเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. tidyr, เชชเซเชธเซเชคเช•เชพเชฒเชฏเชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช—เชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช›เซ‡ tidyverse, เช…เชจเซ‡ เชคเซ‡เชจเชพ เช•เชพเชฐเซเชฏเซ‹เชจเซ‹ เชชเชฐเชฟเชตเชพเชฐ unnest_*().

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ

เชœเซ‹ เชคเชฎเชจเซ‡ เชกเซ‡เชŸเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชฎเชพเช‚ เชฐเชธ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเชจเซ‡ เชฎเชพเชฐเชพเชฎเชพเช‚ เชฐเชธ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ ะธ เชฏเซ เชŸเซเชฏเซเชฌ เชšเซ‡เชจเชฒเซ‹ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ R เชญเชพเชทเชพเชจเซ‡ เชธเชฎเชฐเซเชชเชฟเชค เช›เซ‡.

  1. เชชเชฐเชฟเชšเชฏ
  2. GitHub เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“
  3. เช—เซ€เชฅเชฌ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เช
  4. เช—เซ‡เชฎ เช“เชซ เชฅเซเชฐเซ‹เชจเซเชธเชจเชพ เชชเชพเชคเซเชฐเซ‹
  5. Google เชธเชพเชฅเซ‡ เชœเซ€เช“เช•เซ‹เชกเชฟเช‚เช—
  6. เชถเชพเชฐเซเชฒเชพ เช—เซ‡เชฒเชซเซ‡เชจเซเชกเชจเซ€ เชกเชฟเชธเซเช•เซ‹เช—เซเชฐเชพเชซเซ€
  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() เชœเซ‡เชฎ เช•เซ‡ เช˜เชŸเช•เซ‹เชจเซ‡ เชคเชพเชฐเซ€เช– เชซเซเชฐเซ‡เชฎเชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชธเซ‚เชšเชฟเชฎเชพเช‚เชฅเซ€ เชคเซ‡เชจเชพ เชŸเซ‹เชšเชจเชพ เชธเซเชคเชฐ เชชเชฐ เช–เชธเซ‡เชกเชตเชพ.

เช—เซ€เชฅเชฌ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เช

เชธเซ‚เชšเชฟ เชธเช‚เชฐเซ‡เช–เชฃ 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 เชจเซ‹ เชตเซ‡เช•เซเชŸเชฐ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช, เช–เชพเชฒเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช— เชงเชฐเชพเชตเชคเซ€ เชฒเช‚เชฌเชพเชˆ 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)
#> 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 เชจเซ€ เชœเซ€เช“เช•เซ‹เชกเชฟเช‚เช— เชธเซ‡เชตเชพเชฎเชพเช‚เชฅเซ€ เชฎเซ‡เชณเชตเซ‡เชฒเชพ เชกเซ‡เชŸเชพเชจเซ€ เชตเชงเซ เชœเชŸเชฟเชฒ เชฐเชšเชจเชพ เชœเซ‹เชˆเชถเซเช‚. เช•เซ‡เชถเซ€เช‚เช— เชชเซเชฐเชฎเชพเชฃเชชเชคเซเชฐเซ‹ Google เชจเช•เชถเชพ API เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเชพ เชจเชฟเชฏเชฎเซ‹เชจเซ€ เชตเชฟเชฐเซเชฆเซเชง เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชชเชนเซ‡เชฒเชพ API เชจเซ€ เช†เชธเชชเชพเชธ เชเช• เชธเชฐเชณ เชฐเซ‡เชชเชฐ เชฒเช–เซ€เชถ. เชœเซ‡ 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 เช˜เชŸเช• เชนเซ‹เชฏ เช›เซ‡ (เชœเชฟเชฏเซ‹เช•เซ‹เชกเชฟเช‚เช— 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]>

เชถเชพเชฐเซเชฒเชพ เช—เซ‡เชฒเชซเซ‡เชจเซเชกเชจเซ€ เชกเชฟเชธเซเช•เซ‹เช—เซเชฐเชพเชซเซ€

เช›เซ‡เชฒเซเชฒเซ‡, เช…เชฎเซ‡ เชธเซŒเชฅเซ€ เชœเชŸเชฟเชฒ เชฎเชพเชณเช–เซเช‚ เชœเซ‹เชˆเชถเซเช‚ - เชถเชพเชฐเซเชฒเชพ เช—เซ‡เชฒเชซเซ‡เชจเซเชกเชจเซ€ เชกเชฟเชธเซเช•เซ‹เช—เซเชฐเชพเชซเซ€. เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชœเซ‡เชฎ, เช…เชฎเซ‡ เชธเซ‚เชšเชฟเชจเซ‡ เชธเชฟเช‚เช—เชฒ-เช•เซ‰เชฒเชฎ เชกเซ‡เชŸเชพ เชซเซเชฐเซ‡เชฎเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€เชจเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ€เช เช›เซ€เช เชœเซ‡เชฅเซ€ เชฆเชฐเซ‡เช• เช˜เชŸเช• เชเช• เช…เชฒเช— เช•เซ‰เชฒเชฎ เชนเซ‹เชฏ. เชชเชฃ เชนเซเช‚ เช•เซ‰เชฒเชฎ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค 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 id เช•เซ‰เชฒเชฎเชจเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ เชŸเซ‹เชšเชจเชพ เชธเซเชคเชฐ เชชเชฐ เชชเชฃ เชธเช‚เช—เซเชฐเชนเชฟเชค เช›เซ‡, เชœเซ‡เชฅเซ€ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เช–เชพเชฒเซ€ เชฆเซ‚เชฐ เช•เชฐเซ€ เชถเช•เซ€เช:

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹