प्रोहोस्टर > Блог > प्रशासन > नेस्टेड कॉलम्सचा विस्तार करणे - R भाषा वापरून सूची (टायडीर पॅकेज आणि अननेस्ट फॅमिलीची कार्ये)
नेस्टेड कॉलम्सचा विस्तार करणे - R भाषा वापरून सूची (टायडीर पॅकेज आणि अननेस्ट फॅमिलीची कार्ये)
बहुतेक प्रकरणांमध्ये, API कडून मिळालेल्या प्रतिसादासह किंवा जटिल वृक्ष रचना असलेल्या इतर कोणत्याही डेटासह कार्य करताना, तुम्हाला JSON आणि XML स्वरूपांचा सामना करावा लागतो.
या स्वरूपांचे बरेच फायदे आहेत: ते डेटा अगदी संक्षिप्तपणे संग्रहित करतात आणि आपल्याला माहितीची अनावश्यक डुप्लिकेशन टाळण्याची परवानगी देतात.
या स्वरूपांचे नुकसान त्यांच्या प्रक्रिया आणि विश्लेषणाची जटिलता आहे. असंरचित डेटा गणनेमध्ये वापरला जाऊ शकत नाही आणि त्यावर व्हिज्युअलायझेशन तयार केले जाऊ शकत नाही.
हा लेख प्रकाशनाची तार्किक निरंतरता आहे "आर पॅकेज tidyr आणि त्याची नवीन कार्ये pivot_longer आणि pivot_wider". हे तुम्हाला पॅकेजचा वापर करून अव्यवस्थित डेटा स्ट्रक्चर्सला परिचित आणि विश्लेषणासाठी योग्य टॅब्युलर स्वरूपात आणण्यास मदत करेल. tidyr, लायब्ररीच्या गाभ्यामध्ये समाविष्ट आहे tidyverse, आणि त्याचे कार्यांचे कुटुंब unnest_*().
सामग्री
तुम्हाला डेटा विश्लेषणामध्ये स्वारस्य असल्यास, तुम्हाला माझ्यामध्ये स्वारस्य असेल तार и YouTube चॅनेल बहुतेक सामग्री आर भाषेला समर्पित आहे.
आयताकृती(अनुवादकाची नोंद, मला या संज्ञेसाठी पुरेसे भाषांतर पर्याय सापडले नाहीत, म्हणून आम्ही ते जसे आहे तसे सोडू.) परिचित पंक्ती आणि स्तंभांचा समावेश असलेल्या द्विमितीय सारणीमध्ये नेस्टेड अॅरेसह असंरचित डेटा आणण्याची प्रक्रिया आहे. IN tidyr अशी अनेक फंक्शन्स आहेत जी तुम्हाला नेस्टेड लिस्ट कॉलम्स विस्तृत करण्यात आणि डेटा आयताकृती, सारणी फॉर्ममध्ये कमी करण्यात मदत करतील:
unnest_longer() स्तंभ सूचीतील प्रत्येक घटक घेते आणि नवीन पंक्ती तयार करते.
unnest_wider() स्तंभ सूचीतील प्रत्येक घटक घेतो आणि नवीन स्तंभ तयार करतो.
unnest_auto() कोणते फंक्शन वापरायचे ते आपोआप ठरवते unnest_longer() किंवा unnest_wider().
hoist() च्या सारखे unnest_wider() परंतु केवळ निर्दिष्ट घटक निवडते आणि आपल्याला नेस्टिंगच्या अनेक स्तरांसह कार्य करण्यास अनुमती देते.
द्विमितीय सारणीमध्ये नेस्टिंगच्या अनेक स्तरांसह असंरचित डेटा आणण्याशी संबंधित बहुतेक समस्या dplyr सह सूचीबद्ध फंक्शन्स एकत्र करून सोडवल्या जाऊ शकतात.
या तंत्रांचे प्रदर्शन करण्यासाठी, आम्ही पॅकेज वापरू repurrrsive, जे वेब API वरून मिळवलेल्या एकाधिक जटिल, बहु-स्तरीय सूची प्रदान करते.
चला सुरुवात करूया gh_users, सहा GitHub वापरकर्त्यांबद्दल माहिती असलेली यादी. प्रथम यादीचे रूपांतर करूया gh_users в टिबल फ्रेम:
users <- tibble( user = gh_users )
हे थोडे विरोधाभासी वाटते: सूची का प्रदान करा gh_users, अधिक जटिल डेटा संरचनेसाठी? परंतु डेटा फ्रेमचा एक मोठा फायदा आहे: ते एकाधिक वेक्टर एकत्र करते जेणेकरून सर्व काही एका ऑब्जेक्टमध्ये ट्रॅक केले जाईल.
प्रत्येक ऑब्जेक्ट घटक users नामांकित सूची आहे ज्यामध्ये प्रत्येक घटक स्तंभाचे प्रतिनिधित्व करतो.
या प्रकरणात, आमच्याकडे एक टेबल आहे ज्यामध्ये 30 स्तंभ आहेत आणि आम्हाला त्यापैकी बहुतेकांची आवश्यकता नाही, म्हणून आम्ही त्याऐवजी करू शकतो unnest_wider() वापरा hoist(). hoist() सारखा सिंटॅक्स वापरून आम्हाला निवडलेले घटक काढण्याची परवानगी देते purrr::pluck():
users %>% hoist(user,
followers = "followers",
login = "login",
url = "html_url"
)
#> # A tibble: 6 x 4
#> followers login url user
#> <int> <chr> <chr> <list>
#> 1 303 gaborcsardi https://github.com/gaborcsardi <named list [27]>
#> 2 780 jennybc https://github.com/jennybc <named list [27]>
#> 3 3958 jtleek https://github.com/jtleek <named list [27]>
#> 4 115 juliasilge https://github.com/juliasilge <named list [27]>
#> 5 213 leeper https://github.com/leeper <named list [27]>
#> 6 34 masalmon https://github.com/masalmon <named list [27]>
hoist() स्तंभ सूचीमधून निर्दिष्ट नामित घटक काढून टाकते वापरकर्तात्यामुळे तुम्ही विचार करू शकता hoist() तारीख फ्रेमच्या अंतर्गत सूचीमधून त्याच्या वरच्या स्तरावर घटक हलवण्यासारखे.
Github भांडार
सूची संरेखन gh_repos मध्ये रूपांतरित करून आम्ही त्याचप्रमाणे सुरुवात करतो tibble:
यावेळी घटक वापरकर्ता या वापरकर्त्याच्या मालकीच्या रेपॉजिटरीजची सूची दर्शवते. प्रत्येक रेपॉजिटरी स्वतंत्र निरीक्षण आहे, म्हणून नीट डेटाच्या संकल्पनेनुसार (अंदाजे नीटनेटका डेटा) त्या नवीन रेषा बनल्या पाहिजेत, म्हणूनच आम्ही वापरतो 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() त्यातील प्रत्येक घटक एका स्तंभात ठेवा:
योग्य कार्य निवडण्याचा विचार करण्याऐवजी unnest_longer() किंवा unnest_wider() आपण वापरू शकता unnest_auto(). हे फंक्शन डेटा बदलण्यासाठी सर्वात योग्य फंक्शन निवडण्यासाठी अनेक ह्युरिस्टिक पद्धती वापरते आणि निवडलेल्या पद्धतीबद्दल संदेश प्रदर्शित करते.
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
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)
}
हे फंक्शन रिटर्न देणारी यादी खूपच गुंतागुंतीची आहे:
सुदैवाने, आम्ही फंक्शन्सचा वापर करून हा डेटा टॅब्युलर फॉर्ममध्ये रूपांतरित करण्याच्या समस्येचे निराकरण करू शकतो 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 आर मधील योग्य तारीख आणि वेळेच्या स्वरूपात.
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":
नंतर आवश्यकतेनुसार तुम्ही त्यांना मूळ डेटासेटमध्ये परत सामील करू शकता.
निष्कर्ष
ग्रंथालयाच्या गाभ्यापर्यंत tidyverse सामायिक डेटा प्रोसेसिंग तत्वज्ञानाने एकत्रित केलेली अनेक उपयुक्त पॅकेजेस समाविष्ट आहेत.
या लेखात आम्ही फंक्शन्सच्या कुटुंबाचे परीक्षण केले unnest_*(), ज्याचा उद्देश नेस्टेड सूचीमधून घटक काढण्यासाठी कार्य करणे आहे. या पॅकेजमध्ये इतर अनेक उपयुक्त वैशिष्ट्ये आहेत ज्यामुळे संकल्पनेनुसार डेटा रूपांतरित करणे सोपे होते नीटनेटका डेटा.