Sisäkkäisten sarakkeiden laajentaminen - luettelot R-kielellä (tidyr-paketti ja unnest-perheen toiminnot)
Useimmissa tapauksissa, kun työskentelet API:lta saadun vastauksen tai minkä tahansa muun datan kanssa, jolla on monimutkainen puurakenne, kohtaat JSON- ja XML-muotoja.
Näillä muodoilla on monia etuja: ne tallentavat tiedot melko tiiviisti ja auttavat välttämään tietojen tarpeetonta päällekkäisyyttä.
Näiden formaattien haittana on niiden käsittelyn ja analysoinnin monimutkaisuus. Strukturoimatonta dataa ei voi käyttää laskelmissa eikä visualisointia voida rakentaa sen päälle.
Tämä artikkeli on looginen jatko julkaisulle "R-paketti tidyr ja sen uudet toiminnot pivot_longer ja pivot_wider". Sen avulla saat paketin avulla strukturoimattomat tietorakenteet tuttuun ja analyysiin sopivaan taulukkomuotoon tidyr, sisältyy kirjaston ytimeen tidyverseja sen toimintoperhe unnest_*().
Pitoisuus
Jos olet kiinnostunut data-analyysistä, saatat olla kiinnostunut minun sähke и youtube kanavia. Suurin osa sisällöstä on omistettu R-kielelle.
Suorakaide(Kääntäjän huomautus, en löytänyt sopivia käännösvaihtoehtoja tälle termille, joten jätämme sen ennalleen.) on prosessi, jossa strukturoimatonta tietoa tuodaan sisäkkäisillä taulukoilla kaksiulotteiseen taulukkoon, joka koostuu tutuista riveistä ja sarakkeista. SISÄÄN tidyr On olemassa useita toimintoja, jotka auttavat sinua laajentamaan sisäkkäisiä luettelosarakkeita ja pienentämään tiedot suorakaiteen muotoiseen taulukkomuotoon:
unnest_longer() ottaa sarakeluettelon jokaisen elementin ja luo uuden rivin.
unnest_wider() ottaa sarakeluettelon jokaisen elementin ja luo uuden sarakkeen.
unnest_auto() määrittää automaattisesti, mikä toiminto on paras käyttää unnest_longer() tai unnest_wider().
hoist() samanlainen kuin unnest_wider() mutta valitsee vain määritetyt komponentit ja mahdollistaa useiden sisäkkäistasojen käytön.
Suurin osa ongelmista, jotka liittyvät jäsentämättömän tiedon tuomiseen useilla sisäkkäisillä tasoilla kaksiulotteiseen taulukkoon, voidaan ratkaista yhdistämällä luetellut toiminnot dplyr:n kanssa.
Käytämme pakettia näiden tekniikoiden esittelyyn repurrrsive, joka tarjoaa useita monimutkaisia, monitasoisia luetteloita, jotka on johdettu verkkosovellusliittymästä.
Aloitetaan gh_users, luettelo, joka sisältää tietoja kuudesta GitHub-käyttäjästä. Aluksi muutetaan listaa gh_users в tibble kehys:
users <- tibble( user = gh_users )
Tämä vaikuttaa hieman ristiriitaiselta: miksi antaa luettelo gh_users, monimutkaisempaan tietorakenteeseen? Mutta datakehyksellä on suuri etu: se yhdistää useita vektoreita niin, että kaikkea seurataan yhdessä objektissa.
Jokainen objektielementti users on nimetty luettelo, jossa jokainen elementti edustaa saraketta.
Tässä tapauksessa meillä on taulukko, joka koostuu 30 sarakkeesta, emmekä tarvitse suurinta osaa niistä, joten voimme sen sijaan unnest_wider() käyttää hoist(). hoist() antaa meille mahdollisuuden poimia valitut komponentit käyttämällä samaa syntaksia kuin 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() poistaa määritetyt nimetyt komponentit sarakeluettelosta lähettämäjoten voit harkita hoist() kuten komponenttien siirtäminen päivämääräkehyksen sisäisestä luettelosta sen ylimmälle tasolle.
Githubin arkistot
Listan tasaus gh_repos aloitamme samalla tavalla muuntamalla sen muotoon tibble:
Tällä kertaa elementit lähettämä edustavat luetteloa tämän käyttäjän omistamista tietovarastoista. Jokainen arkisto on erillinen havainto, joten siistin datan käsitteen mukaan (noin siistit tiedot) niistä pitäisi tulla uusia rivejä, minkä vuoksi käytämme unnest_longer() eikä 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
Nyt voimme käyttää unnest_wider() tai 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
Kiinnitä huomiota käyttöön c("owner", "login"): Tämän avulla voimme saada toisen tason arvon sisäkkäisestä luettelosta owner. Vaihtoehtoinen tapa on saada koko luettelo owner ja sitten käyttämällä toimintoa unnest_wider() laita jokainen sen elementti sarakkeeseen:
Sen sijaan, että miettisit oikean toiminnon valintaa unnest_longer() tai unnest_wider() voit käyttää unnest_auto(). Tämä toiminto käyttää useita heuristisia menetelmiä valitakseen sopivimman funktion tietojen muuntamiseen ja näyttää viestin valitusta menetelmästä.
got_chars sillä on identtinen rakenne gh_users: Tämä on joukko nimettyjä listoja, joissa jokainen sisemmän luettelon elementti kuvaa jotakin Game of Thrones -hahmon attribuuttia. Tuominen got_chars Taulukkonäkymää varten aloitamme luomalla päivämääräkehyksen, kuten edellisissä esimerkeissä, ja muunnamme sitten jokaisen elementin erilliseksi sarakkeeksi:
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>
Rakenne got_chars hieman vaikeampaa kuin gh_users, koska joitakin luettelokomponentteja char itse ovat luettelo, jonka seurauksena saamme pilareita - luetteloita:
Jatkotoimesi riippuvat analyysin tavoitteista. Ehkä sinun on lisättävä tiedot jokaisen kirjan ja sarjan riveille, joissa hahmo esiintyy:
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
Tai ehkä haluat luoda taulukon, jonka avulla voit yhdistää hahmon ja työn:
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
(Huomaa tyhjät arvot "" kentällä title, tämä johtuu virheistä, jotka on tehty syötettäessä tietoja got_chars: itse asiassa hahmot, joille kentällä ei ole vastaavia kirjojen ja TV-sarjojen nimiä title täytyy olla vektori, jonka pituus on 0, ei vektori, jonka pituus on 1, joka sisältää tyhjän merkkijonon.)
Voimme kirjoittaa yllä olevan esimerkin uudelleen funktiolla unnest_auto(). Tämä lähestymistapa on kätevä kerta-analyysiin, mutta sinun ei pitäisi luottaa siihen unnest_auto() säännölliseen käyttöön. Asia on siinä, että jos tietorakenne muuttuu unnest_auto() voi muuttaa valitun tiedon muunnosmekanismin, jos se alun perin laajensi luettelon sarakkeet riveiksi käyttämällä unnest_longer(), sitten kun saapuvan tiedon rakenne muuttuu, logiikkaa voidaan muuttaa hyväksi unnest_wider(), ja tämän lähestymistavan jatkuva käyttö voi johtaa odottamattomiin virheisiin.
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
Geokoodaus Googlella
Seuraavaksi tarkastellaan Googlen geokoodauspalvelusta saatujen tietojen monimutkaisempaa rakennetta. Valtuustietojen välimuistiin tallentaminen on vastoin Google Maps API:n kanssa työskentelyä koskevia sääntöjä, joten kirjoitan ensin yksinkertaisen kääreen API:n ympärille. Joka perustuu Google Maps API -avaimen tallentamiseen ympäristömuuttujaan; Jos sinulla ei ole ympäristömuuttujiisi tallennettua avainta Google Maps API:n kanssa työskentelemiseen, tässä osiossa esitettyjä koodinpätkiä ei suoriteta.
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)
}
Tämän funktion palauttama luettelo on melko monimutkainen:
Onneksi voimme ratkaista tämän tiedon muuntamisen taulukkomuotoon vaihe vaiheelta funktioiden avulla tidyr. Tehdäkseni tehtävästä hieman haastavamman ja realistisemman, aloitan geokoodaamalla muutaman kaupungin:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Muunnan tulokseksi saadun tuloksen tibble, lisään mukavuuden vuoksi sarakkeen, jossa on vastaava kaupungin nimi.
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]>
Ensimmäinen taso sisältää komponentteja status и result, jolla voimme laajentaa 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
Huomaa, että results on monitasoinen luettelo. Useimmissa kaupungeissa on yksi elementti (joka edustaa ainutlaatuista arvoa, joka vastaa geokoodaussovellusliittymää), mutta Springfieldissä on kaksi. Voimme vetää ne erillisiin riveihin 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
Nyt niissä kaikissa on samat komponentit, jotka voidaan todentaa käyttämällä 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
Löydämme kunkin kaupungin leveys- ja pituuskoordinaatit laajentamalla luetteloa 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>
Ja sitten paikka, johon sinun on laajennettava 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>
jälleen unnest_auto() yksinkertaistaa kuvattua toimintaa joillakin riskeillä, jotka voivat aiheutua saapuvan tiedon rakenteen muuttamisesta:
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>
Voimme myös katsoa kunkin kaupungin ensimmäistä osoitetta:
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>
Tai käyttää hoist() monitasoiseen sukellukseen, johon pääsee suoraan 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 Gelfandin diskografia
Lopuksi tarkastellaan monimutkaisinta rakennetta - Sharla Gelfandin diskografiaa. Kuten yllä olevissa esimerkeissä, aloitamme muuntamalla luettelon yhden sarakkeen tietokehykseksi ja laajennamme sitä niin, että jokainen komponentti on erillinen sarake. Muutan myös sarakkeen date_added sopivaan päivämäärän ja kellonajan muotoon R:ssä.
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
Tällä tasolla saamme tietoa siitä, milloin jokainen levy on lisätty Sharlan diskografiaan, mutta emme näe mitään tietoja kyseisistä levyistä. Tätä varten meidän on laajennettava saraketta basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Valitettavasti saamme virheilmoituksen, koska... listan sisällä basic_information on samanniminen sarake basic_information. Jos tällainen virhe ilmenee, voit määrittää sen syyn nopeasti käyttämällä names_repair = "unique":
Voit sitten liittää ne takaisin alkuperäiseen tietojoukkoon tarpeen mukaan.
Johtopäätös
Kirjaston ytimeen tidyverse sisältää monia hyödyllisiä paketteja, joita yhdistää yhteinen tietojenkäsittelyfilosofia.
Tässä artikkelissa tarkastelimme funktioperhettä unnest_*(), joiden tarkoituksena on poimia elementtejä sisäkkäisistä luetteloista. Tämä paketti sisältää monia muita hyödyllisiä ominaisuuksia, jotka helpottavat tietojen muuntamista konseptin mukaan Siistit tiedot.