پرو هوسٽر > بلاگ > انتظاميه > نيسٽ ٿيل ڪالمن کي وڌائڻ - آر ٻولي استعمال ڪندي لسٽون (ٽائڊر پيڪيج ۽ غير اينسٽ خاندان جا ڪم)
نيسٽ ٿيل ڪالمن کي وڌائڻ - آر ٻولي استعمال ڪندي لسٽون (ٽائڊر پيڪيج ۽ غير اينسٽ خاندان جا ڪم)
اڪثر صورتن ۾، جڏهن API مان حاصل ڪيل جواب سان ڪم ڪري رهيو آهي، يا ڪنهن ٻئي ڊيٽا سان جيڪو پيچيده وڻ جي جوڙجڪ آهي، توهان کي JSON ۽ XML فارميٽ سان منهن ڏيڻو پوندو.
انهن فارميٽ جا ڪيترائي فائدا آهن: اهي ڊيٽا کي ڪافي ترتيب سان محفوظ ڪن ٿا ۽ توهان کي معلومات جي غير ضروري نقل کان بچڻ جي اجازت ڏين ٿا.
انهن شڪلن جو نقصان انهن جي پروسيسنگ ۽ تجزيو جي پيچيدگي آهي. غير منظم ٿيل ڊيٽا حسابن ۾ استعمال نه ٿي ڪري سگھجي ۽ ان تي بصري تعمير نه ٿي سگھي.
هي مضمون اشاعت جي منطقي تسلسل آهي "آر پيڪيج tidyr ۽ ان جا نوان فنڪشن pivot_longer ۽ pivot_wider". اهو توهان جي مدد ڪندو غير منظم ڊيٽا ڍانچي کي هڪ واقف ۽ مناسب ۾ آڻڻ لاءِ تجزيو ٽيبلر فارم استعمال ڪندي پيڪيج tidyr، لائبريري جي بنيادي حصي ۾ شامل آهي tidyverse، ۽ ان جي ڪمن جو خاندان unnest_*().
Contents
جيڪڏهن توهان ڊيٽا جي تجزيي ۾ دلچسپي رکو ٿا، توهان کي شايد دلچسپي وٺندي منهنجي ٽيليگرام и يوٽيوب چينلز. گهڻو ڪري مواد آر ٻولي لاء وقف آهي.
مستطيل(مترجم جو نوٽ، مون کي هن اصطلاح لاءِ ترجمي جا مناسب آپشن نه مليا، تنهنڪري اسان ان کي ائين ئي ڇڏي ڏينداسين.) اڻ ڄاتل ڊيٽا کي nested arrays سان گڏ هڪ ٻه-dimensional جدول ۾ آڻڻ جو عمل آهي جنهن ۾ واقف قطارون ۽ ڪالمن شامل آهن. IN tidyr اتي ڪيترائي فنڪشن آھن جيڪي توھان جي مدد ڪندا آھن نسٽڊ لسٽ ڪالمن کي وڌائڻ ۽ ڊيٽا کي گھٽائڻ ۾ مستطيل، ٽيبلر فارم:
unnest_longer() ڪالمن جي فهرست جي هر عنصر کي وٺي ٿو ۽ نئين قطار ٺاهي ٿو.
unnest_wider() ڪالمن جي فهرست جي هر عنصر کي وٺي ٿو ۽ هڪ نئون ڪالم ٺاهي ٿو.
unnest_auto() خودڪار طريقي سان طئي ڪري ٿو ته ڪهڙو فنڪشن استعمال ڪرڻ لاء بهترين آهي unnest_longer() يا unnest_wider().
hoist() جهڙو unnest_wider() پر صرف مخصوص حصن کي چونڊيندو آهي ۽ توهان کي ڪم ڪرڻ جي اجازت ڏئي ٿو ڪيترن ئي سطحن جي nesting سان.
گھڻن سطحن سان اڻ ٺھيل ڊيٽا آڻڻ سان جڙيل مسئلا ٻه-dimensional جدول ۾ گھڻن سطحن سان گڏ درج ٿيل ڪمن کي dplyr سان گڏ ڪري حل ڪري سگھجن ٿا.
انهن ٽيڪنالاجي کي ظاهر ڪرڻ لاء، اسان پيڪيج استعمال ڪنداسين repurrrsive، جيڪو ويب API مان نڪتل گھڻن پيچيده، گھڻن سطحي لسٽن کي مهيا ڪري ٿو.
انهي صورت ۾، اسان وٽ هڪ ٽيبل آهي جنهن ۾ 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:
هن ڀيري عناصر يوزر هن صارف جي ملڪيت جي ذخيرن جي هڪ فهرست جي نمائندگي ڪريو. هر مخزن هڪ الڳ مشاهدو آهي، تنهنڪري صاف ڊيٽا جي تصور جي مطابق (تقريبن صاف ڊيٽا) انهن کي نيون لائينون ٿيڻ گهرجي، ڇو ته اسان استعمال ڪريون ٿا 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() ان جي هر عنصر کي ڪالم ۾ وجھو:
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(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)
}
خوشقسمتيءَ سان، اسان ھن ڊيٽا کي جدول ۾ تبديل ڪرڻ جو مسئلو حل ڪري سگھون ٿا قدم قدم سان افعال استعمال ڪندي 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":
لائبريريءَ جي مرڪز تائين tidyverse هڪ عام ڊيٽا پروسيسنگ فلسفه طرفان متحد ڪيترائي مفيد پيڪيجز شامل آهن.
هن آرٽيڪل ۾ اسان ڪمن جي خاندان کي جانچيو unnest_*()، جنهن جو مقصد آهي ڪم ڪرڻ سان گڏ ڪم ڪرڻ جي عنصرن کي nested فهرستن مان. هن پيڪيج ۾ ڪيتريون ئي ٻيون مفيد خاصيتون شامل آهن جيڪي تصور جي مطابق ڊيٽا کي تبديل ڪرڻ آسان بڻائي ٿي صاف ڊيٽا.