ProHoster > Blog > Pangangasiwa > Pagpapalawak ng mga nested column - mga listahan gamit ang R language (tidyr package at mga function ng unnest family)
Pagpapalawak ng mga nested column - mga listahan gamit ang R language (tidyr package at mga function ng unnest family)
Sa karamihan ng mga kaso, kapag nagtatrabaho sa isang tugon na natanggap mula sa isang API, o sa anumang iba pang data na may kumplikadong istraktura ng puno, nahaharap ka sa mga JSON at XML na format.
Ang mga format na ito ay may maraming mga pakinabang: nag-iimbak sila ng data nang medyo compact at nagbibigay-daan sa iyo upang maiwasan ang hindi kinakailangang pagdoble ng impormasyon.
Ang kawalan ng mga format na ito ay ang pagiging kumplikado ng kanilang pagproseso at pagsusuri. Ang hindi nakabalangkas na data ay hindi magagamit sa mga kalkulasyon at hindi maaaring itayo dito ang visualization.
Ang artikulong ito ay isang lohikal na pagpapatuloy ng publikasyon "R package tidyr at ang mga bagong function nito pivot_longer at pivot_wider". Makakatulong ito sa iyong dalhin ang mga hindi nakabalangkas na istruktura ng data sa isang pamilyar at angkop para sa pagtatasa ng tabular na form gamit ang package tidyr, kasama sa core ng library tidyverse, at ang pamilya ng mga function nito unnest_*().
nilalaman
Kung interesado ka sa pagsusuri ng data, maaaring interesado ka sa aking telegram и youtube mga channel. Karamihan sa nilalaman ay nakatuon sa wikang R.
Parihaba(tala ng tagasalin, hindi ako nakahanap ng sapat na mga opsyon sa pagsasalin para sa terminong ito, kaya hahayaan namin ito kung ano ito.) ay ang proseso ng pagdadala ng hindi nakabalangkas na data na may mga nested array sa isang two-dimensional na talahanayan na binubuo ng mga pamilyar na row at column. SA tidyr Mayroong ilang mga function na makakatulong sa iyong palawakin ang mga nested list column at bawasan ang data sa isang hugis-parihaba, tabular na form:
unnest_longer() kinukuha ang bawat elemento ng listahan ng column at lumilikha ng bagong row.
unnest_wider() kinukuha ang bawat elemento ng listahan ng column at gumagawa ng bagong column.
unnest_auto() awtomatikong tinutukoy kung aling function ang pinakamahusay na gamitin unnest_longer() o unnest_wider().
hoist() kapareho ng unnest_wider() ngunit pinipili lamang ang mga tinukoy na bahagi at pinapayagan kang magtrabaho kasama ang ilang mga antas ng nesting.
Karamihan sa mga problemang nauugnay sa pagdadala ng hindi nakabalangkas na data na may ilang antas ng nesting sa isang two-dimensional na talahanayan ay maaaring malutas sa pamamagitan ng pagsasama ng mga nakalistang function sa dplyr.
Upang ipakita ang mga diskarteng ito, gagamitin namin ang package repurrrsive, na nagbibigay ng maraming kumplikado, maraming antas na listahan na hinango mula sa isang web API.
Magsimula tayo gh_users, isang listahan na naglalaman ng impormasyon tungkol sa anim na user ng GitHub. Ibahin muna natin ang listahan gh_users в tibble frame:
users <- tibble( user = gh_users )
Ito ay tila isang maliit na counterintuitive: bakit magbigay ng isang listahan gh_users, sa isang mas kumplikadong istraktura ng data? Ngunit ang isang data frame ay may malaking kalamangan: pinagsasama nito ang maramihang mga vector upang ang lahat ay masubaybayan sa isang bagay.
Bawat elemento ng bagay users ay isang pinangalanang listahan kung saan ang bawat elemento ay kumakatawan sa isang column.
Sa kasong ito, mayroon kaming isang talahanayan na binubuo ng 30 mga haligi, at hindi namin kakailanganin ang karamihan sa mga ito, kaya maaari naming unnest_wider() gamitin hoist(). hoist() nagbibigay-daan sa amin na kunin ang mga napiling bahagi gamit ang parehong syntax bilang 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() inaalis ang tinukoy na pinangalanang mga bahagi mula sa isang listahan ng hanay gumagamitpara mapag-isipan mo hoist() tulad ng paglipat ng mga bahagi mula sa panloob na listahan ng isang frame ng petsa patungo sa pinakamataas na antas nito.
Mga imbakan ng Github
Pag-align ng listahan gh_repos pareho tayong nagsisimula sa pamamagitan ng pag-convert nito sa tibble:
Sa pagkakataong ito ang mga elemento gumagamit kumakatawan sa isang listahan ng mga repository na pag-aari ng user na ito. Ang bawat imbakan ay isang hiwalay na pagmamasid, kaya ayon sa konsepto ng malinis na data (tinatayang malinis na data) dapat silang maging mga bagong linya, kaya naman ginagamit namin unnest_longer() hindi 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
Ngayon ay magagamit na natin unnest_wider() o 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
Bigyang-pansin ang paggamit c("owner", "login"): Nagbibigay-daan ito sa amin na makuha ang pangalawang antas na halaga mula sa isang naka-nest na listahan owner. Ang isang alternatibong diskarte ay upang makuha ang buong listahan owner at pagkatapos ay gamit ang function unnest_wider() ilagay ang bawat elemento nito sa isang column:
Sa halip na mag-isip tungkol sa pagpili ng tamang function unnest_longer() o unnest_wider() pwede mong gamitin unnest_auto(). Gumagamit ang function na ito ng ilang heuristic na pamamaraan upang piliin ang pinakaangkop na function para sa pagbabago ng data, at nagpapakita ng mensahe tungkol sa napiling paraan.
got_chars ay may magkaparehong istraktura sa gh_users: Ito ay isang hanay ng mga pinangalanang listahan, kung saan ang bawat elemento ng panloob na listahan ay naglalarawan ng ilang katangian ng isang Game of Thrones na karakter. Nagdadala got_chars Para sa view ng talahanayan, magsisimula kami sa pamamagitan ng paglikha ng frame ng petsa, tulad ng sa mga nakaraang halimbawa, at pagkatapos ay i-convert ang bawat elemento sa isang hiwalay na column:
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>
Kaayusan got_chars medyo mas mahirap kaysa gh_users, dahil ilang bahagi ng listahan char ang kanilang mga sarili ay isang listahan, bilang isang resulta nakakakuha kami ng mga haligi - mga listahan:
Ang iyong mga karagdagang aksyon ay nakasalalay sa mga layunin ng pagsusuri. Marahil ay kailangan mong maglagay ng impormasyon sa mga linya para sa bawat libro at serye kung saan lumilitaw ang karakter:
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
O baka gusto mong lumikha ng isang talahanayan na nagbibigay-daan sa iyong itugma ang karakter at ang gawain:
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
(Tandaan ang mga walang laman na halaga "" sa bukid title, ito ay dahil sa mga error na ginawa kapag naglalagay ng data sa got_chars: sa katunayan, ang mga karakter kung saan walang katumbas na mga pamagat ng libro at serye sa TV sa larangan title dapat ay may vector na may haba na 0, hindi isang vector na may haba na 1 na naglalaman ng walang laman na string.)
Maaari naming muling isulat ang halimbawa sa itaas gamit ang function unnest_auto(). Ang diskarte na ito ay maginhawa para sa isang beses na pagsusuri, ngunit hindi ka dapat umasa unnest_auto() para sa regular na paggamit. Ang punto ay kung magbabago ang istraktura ng iyong data unnest_auto() maaaring baguhin ang napiling mekanismo ng pagbabagong-anyo ng data kung una nitong pinalawak ang mga column ng listahan sa mga row gamit ang unnest_longer(), pagkatapos ay kapag ang istraktura ng papasok na data ay nagbago, ang lohika ay maaaring baguhin sa pabor unnest_wider(), at ang patuloy na paggamit ng diskarteng ito ay maaaring humantong sa mga hindi inaasahang error.
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
Geocoding sa Google
Susunod, titingnan natin ang isang mas kumplikadong istraktura ng data na nakuha mula sa serbisyo ng geocoding ng Google. Ang mga kredensyal sa pag-cache ay labag sa mga panuntunan ng pagtatrabaho sa Google maps API, kaya magsusulat muna ako ng isang simpleng wrapper sa paligid ng API. Na batay sa pag-iimbak ng Google Maps API key sa isang variable ng kapaligiran; Kung wala kang susi para sa pagtatrabaho sa Google Maps API na nakaimbak sa iyong mga variable ng kapaligiran, ang mga fragment ng code na ipinakita sa seksyong ito ay hindi isasagawa.
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)
}
Ang listahan na ibinabalik ng function na ito ay medyo kumplikado:
Sa kabutihang palad, maaari naming malutas ang problema ng pag-convert ng data na ito sa isang tabular na form na hakbang-hakbang gamit ang mga function tidyr. Upang gawing mas mahirap at makatotohanan ang gawain, magsisimula ako sa pamamagitan ng geocoding ng ilang lungsod:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Iko-convert ko ang resultang resulta sa tibble, para sa kaginhawahan, magdaragdag ako ng column na may katumbas na pangalan ng lungsod.
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]>
Ang unang antas ay naglalaman ng mga bahagi status и result, na maaari nating palawakin 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
Mangyaring tandaan na ang results ay isang multi-level na listahan. Karamihan sa mga lungsod ay may 1 elemento (kumakatawan sa isang natatanging halaga na tumutugma sa geocoding API), ngunit ang Springfield ay may dalawa. Maaari naming hilahin ang mga ito sa magkahiwalay na linya gamit ang 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
Ngayon lahat sila ay may parehong mga bahagi, na maaaring ma-verify gamit 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
Mahahanap natin ang mga coordinate ng latitude at longitude ng bawat lungsod sa pamamagitan ng pagpapalawak ng listahan 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>
At pagkatapos ay ang lokasyon kung saan kailangan mong palawakin 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>
Ngunit muli, unnest_auto() pinapasimple ang inilarawan na operasyon na may ilang mga panganib na maaaring sanhi ng pagbabago ng istraktura ng papasok na data:
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>
Maaari din nating tingnan ang unang address para sa bawat lungsod:
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>
O gamitin hoist() para sa isang multi-level na dive na direktang mapuntahan 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]>
Discography ni Sharla Gelfand
Sa wakas, titingnan natin ang pinaka kumplikadong istraktura - ang discography ni Sharla Gelfand. Tulad ng sa mga halimbawa sa itaas, magsisimula kami sa pamamagitan ng pag-convert ng listahan sa isang solong column na data frame, at pagkatapos ay palawigin ito upang ang bawat bahagi ay isang hiwalay na column. Binabago ko rin ang column date_added sa naaangkop na format ng petsa at oras sa 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
Sa antas na ito, nakakakuha kami ng impormasyon tungkol sa kung kailan idinagdag ang bawat disc sa discography ni Sharla, ngunit wala kaming nakikitang anumang data tungkol sa mga disc na iyon. Upang gawin ito kailangan nating palawakin ang hanay basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Sa kasamaang palad, makakatanggap kami ng isang error, dahil... sa loob ng listahan basic_information mayroong isang hanay ng parehong pangalan basic_information. Kung nangyari ang naturang error, upang mabilis na matukoy ang sanhi nito, maaari mong gamitin names_repair = "unique":
Pagkatapos ay maaari mo silang samahan pabalik sa orihinal na dataset kung kinakailangan.
Konklusyon
Sa kaibuturan ng library tidyverse may kasamang maraming kapaki-pakinabang na pakete na pinagsama ng isang karaniwang pilosopiya sa pagproseso ng data.
Sa artikulong ito sinuri namin ang pamilya ng mga pag-andar unnest_*(), na naglalayong magtrabaho sa pagkuha ng mga elemento mula sa mga naka-nest na listahan. Naglalaman ang package na ito ng maraming iba pang kapaki-pakinabang na feature na nagpapadali sa pag-convert ng data ayon sa konsepto Malinis na Data.