نيسٽ ٿيل ڪالمن کي وڌائڻ - آر ٻولي استعمال ڪندي لسٽون (ٽائڊر پيڪيج ۽ غير اينسٽ خاندان جا ڪم)

اڪثر صورتن ۾، جڏهن API مان حاصل ڪيل جواب سان ڪم ڪري رهيو آهي، يا ڪنهن ٻئي ڊيٽا سان جيڪو پيچيده وڻ جي جوڙجڪ آهي، توهان کي JSON ۽ XML فارميٽ سان منهن ڏيڻو پوندو.

انهن فارميٽ جا ڪيترائي فائدا آهن: اهي ڊيٽا کي ڪافي ترتيب سان محفوظ ڪن ٿا ۽ توهان کي معلومات جي غير ضروري نقل کان بچڻ جي اجازت ڏين ٿا.

انهن شڪلن جو نقصان انهن جي پروسيسنگ ۽ تجزيو جي پيچيدگي آهي. غير منظم ٿيل ڊيٽا حسابن ۾ استعمال نه ٿي ڪري سگھجي ۽ ان تي بصري تعمير نه ٿي سگھي.

نيسٽ ٿيل ڪالمن کي وڌائڻ - آر ٻولي استعمال ڪندي لسٽون (ٽائڊر پيڪيج ۽ غير اينسٽ خاندان جا ڪم)

هي مضمون اشاعت جي منطقي تسلسل آهي "آر پيڪيج tidyr ۽ ان جا نوان فنڪشن pivot_longer ۽ pivot_wider". اهو توهان جي مدد ڪندو غير منظم ڊيٽا ڍانچي کي هڪ واقف ۽ مناسب ۾ آڻڻ لاءِ تجزيو ٽيبلر فارم استعمال ڪندي پيڪيج tidyr، لائبريري جي بنيادي حصي ۾ شامل آهي tidyverse، ۽ ان جي ڪمن جو خاندان unnest_*().

Contents

جيڪڏهن توهان ڊيٽا جي تجزيي ۾ دلچسپي رکو ٿا، توهان کي شايد دلچسپي وٺندي منهنجي ٽيليگرام и يوٽيوب چينلز. گهڻو ڪري مواد آر ٻولي لاء وقف آهي.

  1. تعارف
  2. GitHub استعمال ڪندڙ
  3. Github repositories
  4. Game of Thrones ڪردار
  5. گوگل سان جيوڪوڊنگ
  6. شارلا گيلفنڊ جي ڊسڪوگرافي
  7. ٿڪل

تعارف

مستطيل (مترجم جو نوٽ، مون کي هن اصطلاح لاءِ ترجمي جا مناسب آپشن نه مليا، تنهنڪري اسان ان کي ائين ئي ڇڏي ڏينداسين.) اڻ ڄاتل ڊيٽا کي nested arrays سان گڏ هڪ ٻه-dimensional جدول ۾ آڻڻ جو عمل آهي جنهن ۾ واقف قطارون ۽ ڪالمن شامل آهن. IN tidyr اتي ڪيترائي فنڪشن آھن جيڪي توھان جي مدد ڪندا آھن نسٽڊ لسٽ ڪالمن کي وڌائڻ ۽ ڊيٽا کي گھٽائڻ ۾ مستطيل، ٽيبلر فارم:

  • unnest_longer() ڪالمن جي فهرست جي هر عنصر کي وٺي ٿو ۽ نئين قطار ٺاهي ٿو.
  • unnest_wider() ڪالمن جي فهرست جي هر عنصر کي وٺي ٿو ۽ هڪ نئون ڪالم ٺاهي ٿو.
  • unnest_auto() خودڪار طريقي سان طئي ڪري ٿو ته ڪهڙو فنڪشن استعمال ڪرڻ لاء بهترين آهي
    unnest_longer() يا unnest_wider().
  • hoist() جهڙو unnest_wider() پر صرف مخصوص حصن کي چونڊيندو آهي ۽ توهان کي ڪم ڪرڻ جي اجازت ڏئي ٿو ڪيترن ئي سطحن جي nesting سان.

گھڻن سطحن سان اڻ ٺھيل ڊيٽا آڻڻ سان جڙيل مسئلا ٻه-dimensional جدول ۾ گھڻن سطحن سان گڏ درج ٿيل ڪمن کي 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 repositories

لسٽ جي ترتيب 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

استعمال تي Payيان ڏيو c("owner", "login"): هي اسان کي اجازت ڏئي ٿو ته ٻئي سطح جي قيمت حاصل ڪرڻ لاء هڪ nested فهرست مان 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>

Game of Thrones ڪردار

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

گوگل سان جيوڪوڊنگ

اڳيون، اسان گوگل جي جيوڪوڊنگ سروس مان حاصل ڪيل ڊيٽا جي وڌيڪ پيچيده جوڙجڪ تي نظر ڪنداسين. ڪيشنگ سندون گوگل ميپس API سان ڪم ڪرڻ جي قاعدن جي خلاف آهي، تنهن ڪري آئون پهريون ڀيرو API جي چوڌاري هڪ سادي لفافي لکندس. جيڪو ماحول جي متغير ۾ Google Maps API کي محفوظ ڪرڻ تي ٻڌل آهي؛ جيڪڏهن توهان وٽ ڪم ڪرڻ لاءِ ڪنجي نه آهي گوگل ميپس 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 جي ڊسڪوگرافي. جيئن مٿي ڏنل مثالن ۾، اسان فهرست کي ھڪڙي ڪالم ڊيٽا فريم ۾ تبديل ڪندي شروع ڪريون ٿا، ۽ پوء ان کي وڌايو ته جيئن ھر جزو ھڪڙو الڳ ڪالم آھي. پڻ مون ڪالمن کي تبديل ڪيو date_added آر ۾ مناسب تاريخ ۽ وقت جي شڪل ۾.

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 جي ڊسڪگرافي ۾ شامل ڪيو ويو، پر اسان انهن ڊسڪ بابت ڪا به ڊيٽا نه ٿا ڏسو. هن کي ڪرڻ لاء اسان کي ڪالمن کي وڌائڻو پوندو 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_*()، جنهن جو مقصد آهي ڪم ڪرڻ سان گڏ ڪم ڪرڻ جي عنصرن کي nested فهرستن مان. هن پيڪيج ۾ ڪيتريون ئي ٻيون مفيد خاصيتون شامل آهن جيڪي تصور جي مطابق ڊيٽا کي تبديل ڪرڻ آسان بڻائي ٿي صاف ڊيٽا.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو