ProHoster > Blogs > Administrācija > Ligzdoto kolonnu izvēršana — saraksti, izmantojot R valodu (tidyr pakotne un unnest saimes funkcijas)
Ligzdoto kolonnu izvēršana — saraksti, izmantojot R valodu (tidyr pakotne un unnest saimes funkcijas)
Vairumā gadījumu, strādājot ar atbildi, kas saņemta no API, vai ar citiem datiem, kuriem ir sarežģīta koka struktūra, jūs saskaraties ar JSON un XML formātiem.
Šiem formātiem ir daudz priekšrocību: tie glabā datus diezgan kompakti un ļauj izvairīties no nevajadzīgas informācijas dublēšanās.
Šo formātu trūkums ir to apstrādes un analīzes sarežģītība. Nestrukturētus datus nevar izmantot aprēķinos, un uz tiem nevar veidot vizualizāciju.
Šis raksts ir loģisks publikācijas turpinājums "R pakotne tidyr un tās jaunās funkcijas pivot_longer un pivot_wider". Tas palīdzēs jums izveidot nestrukturētas datu struktūras pazīstamā un analīzei piemērotā tabulas formā, izmantojot paketi tidyr, kas iekļauts bibliotēkas kodolā tidyverse, un tā funkciju saime unnest_*().
saturs
Ja jūs interesē datu analīze, jūs varētu interesēt mana telegramma и youtube kanāliem. Lielākā daļa satura ir veltīta R valodai.
Taisnstūris(Tulkotāja piezīme, es neatradu šim terminam atbilstošas tulkošanas iespējas, tāpēc atstāsim to kā ir.) ir process, kurā tiek ievietoti nestrukturēti dati ar ligzdotiem masīviem divdimensiju tabulā, kas sastāv no pazīstamām rindām un kolonnām. IN tidyr Ir vairākas funkcijas, kas palīdzēs izvērst ligzdotās saraksta kolonnas un samazināt datus līdz taisnstūrveida tabulas formai.
unnest_longer() ņem katru kolonnu saraksta elementu un izveido jaunu rindu.
unnest_wider() ņem katru kolonnu saraksta elementu un izveido jaunu kolonnu.
unnest_auto() automātiski nosaka, kuru funkciju vislabāk izmantot unnest_longer() vai unnest_wider().
hoist() līdzīgs unnest_wider() bet atlasa tikai norādītos komponentus un ļauj strādāt ar vairākiem ligzdošanas līmeņiem.
Lielāko daļu problēmu, kas saistītas ar nestrukturētu datu ievietošanu ar vairākiem ligzdošanas līmeņiem divdimensiju tabulā, var atrisināt, apvienojot uzskaitītās funkcijas ar dplyr.
Lai demonstrētu šīs metodes, mēs izmantosim paketi repurrrsive, kas nodrošina vairākus sarežģītus, daudzlīmeņu sarakstus, kas iegūti no tīmekļa API.
Sāksim ar gh_users, saraksts, kurā ir informācija par sešiem GitHub lietotājiem. Vispirms pārveidosim sarakstu gh_users в tibble rāmis:
users <- tibble( user = gh_users )
Tas šķiet nedaudz pretrunīgi: kāpēc sniegt sarakstu gh_users, uz sarežģītāku datu struktūru? Taču datu rāmim ir liela priekšrocība: tas apvieno vairākus vektorus, lai viss tiktu izsekots vienā objektā.
Katrs objekta elements users ir nosaukts saraksts, kurā katrs elements apzīmē kolonnu.
Šajā gadījumā mums ir tabula, kas sastāv no 30 kolonnām, un lielākā daļa no tām mums nebūs vajadzīgas, tāpēc mēs varam unnest_wider() izmantot hoist(). hoist() ļauj mums iegūt atlasītos komponentus, izmantojot to pašu sintaksi kā 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() noņem norādītos nosauktos komponentus no kolonnu saraksta lietotājslai jūs varētu apsvērt hoist() piemēram, komponentu pārvietošana no datuma rāmja iekšējā saraksta uz tā augstāko līmeni.
Github krātuves
Saraksta izlīdzināšana gh_repos mēs sākam līdzīgi, pārvēršot to uz tibble:
Šoreiz elementi lietotājs ir šim lietotājam piederošo krātuvju saraksts. Katrs repozitorijs ir atsevišķs novērojums, tāpēc saskaņā ar kārtīgu datu jēdzienu (aptuveni sakopti dati) tām jākļūst par jaunām līnijām, tāpēc mēs izmantojam unnest_longer() bet ne 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
Tagad mēs varam izmantot unnest_wider() vai 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
Pievērsiet uzmanību lietošanai c("owner", "login"): Tas ļauj mums iegūt otrā līmeņa vērtību no ligzdotā saraksta owner. Alternatīva pieeja ir iegūt visu sarakstu owner un pēc tam izmantojot funkciju unnest_wider() ievietojiet katru tā elementu kolonnā:
Tā vietā, lai domātu par pareizās funkcijas izvēli unnest_longer() vai unnest_wider() tu vari izmantot unnest_auto(). Šī funkcija izmanto vairākas heiristiskās metodes, lai izvēlētos vispiemērotāko funkciju datu pārveidošanai, un parāda ziņojumu par izvēlēto metodi.
got_chars ir identiska struktūra gh_users: šī ir nosauktu sarakstu kopa, kurā katrs iekšējā saraksta elements apraksta kādu Troņu spēles varoņa atribūtu. Atnešana got_chars Tabulas skatam mēs sākam, izveidojot datuma rāmi, tāpat kā iepriekšējos piemēros, un pēc tam pārvēršam katru elementu atsevišķā kolonnā:
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>
Struktūra got_chars nedaudz grūtāk nekā gh_users, jo daži saraksta komponenti char paši ir saraksts, kā rezultātā mēs iegūstam pīlārus - sarakstus:
Jūsu turpmākās darbības ir atkarīgas no analīzes mērķiem. Varbūt jums ir jāievieto informācija katras grāmatas un sērijas rindās, kurās parādās varonis:
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
Vai varbūt vēlaties izveidot tabulu, kas ļauj saskaņot raksturu un darbu:
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
(Ņemiet vērā tukšās vērtības "" laukā title, tas ir saistīts ar kļūdām, kas pieļautas, ievadot datus got_chars: patiesībā varoņi, kuriem šajā jomā nav atbilstošu grāmatu un seriālu nosaukumu title jābūt vektoram ar garumu 0, nevis vektoram ar garumu 1, kas satur tukšu virkni.)
Iepriekš minēto piemēru varam pārrakstīt, izmantojot funkciju unnest_auto(). Šī pieeja ir ērta vienreizējai analīzei, taču jums nevajadzētu uz to paļauties unnest_auto() regulārai lietošanai. Lieta ir tāda, ka mainās jūsu datu struktūra unnest_auto() var mainīt atlasīto datu pārveidošanas mehānismu, ja tas sākotnēji paplašināja saraksta kolonnas rindās, izmantojot unnest_longer(), tad, mainoties ienākošo datu struktūrai, loģiku var mainīt par labu unnest_wider(), un šīs pieejas pastāvīga izmantošana var izraisīt neparedzētas kļūdas.
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
Ģeokodēšana ar Google
Tālāk mēs aplūkosim Google ģeokodēšanas pakalpojuma iegūto datu sarežģītāku struktūru. Akreditācijas datu saglabāšana kešatmiņā ir pretrunā ar noteikumiem par darbu ar Google Maps API, tāpēc vispirms ap API uzrakstīšu vienkāršu iesaiņojumu. Kuras pamatā ir Google Maps API atslēgas saglabāšana vides mainīgajā; Ja jūsu vides mainīgajos nav saglabāta atslēga darbam ar Google Maps API, šajā sadaļā norādītie koda fragmenti netiks izpildīti.
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)
}
Šīs funkcijas atdotais saraksts ir diezgan sarežģīts:
Par laimi, mēs varam atrisināt problēmu, kas saistīta ar šo datu pārvēršanu tabulas formā, soli pa solim, izmantojot funkcijas tidyr. Lai padarītu uzdevumu nedaudz sarežģītāku un reālistiskāku, es sākšu ar dažu pilsētu ģeokodēšanu:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Es pārvēršu iegūto rezultātu par tibble, ērtības labad pievienošu kolonnu ar atbilstošo pilsētas nosaukumu.
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]>
Pirmajā līmenī ir komponenti status и result, ar ko varam paplašināties 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
Lūdzu, ņemiet vērā, ka results ir daudzlīmeņu saraksts. Lielākajai daļai pilsētu ir 1 elements (kas atspoguļo unikālu vērtību, kas atbilst ģeokodēšanas API), bet Springfīldai ir divi. Mēs varam tos ievilkt atsevišķās rindās ar 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
Tagad tiem visiem ir vienas un tās pašas sastāvdaļas, kuras var pārbaudīt, izmantojot 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
Mēs varam atrast katras pilsētas platuma un garuma koordinātas, paplašinot sarakstu 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>
Un tad vieta, kurai jums ir jāpaplašina 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>
Jau atkal, unnest_auto() vienkāršo aprakstīto darbību ar dažiem riskiem, ko var izraisīt ienākošo datu struktūras maiņa:
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>
Mēs varam arī apskatīt katras pilsētas pirmo adresi:
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>
Vai arī izmantot hoist() daudzlīmeņu niršanai, uz kuru doties tieši 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]>
Šārlas Gelfandas diskogrāfija
Visbeidzot, mēs apskatīsim vissarežģītāko struktūru - Sharla Gelfand diskogrāfiju. Tāpat kā iepriekš minētajos piemēros, mēs sākam, pārveidojot sarakstu par vienas kolonnas datu rāmi un pēc tam pagarinām to, lai katrs komponents būtu atsevišķa kolonna. Arī es pārveidoju kolonnu date_added atbilstošā datuma un laika formātā 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
Šajā līmenī mēs iegūstam informāciju par to, kad katrs disks tika pievienots Sharla diskogrāfijai, taču mēs neredzam nekādus datus par šiem diskiem. Lai to izdarītu, kolonna ir jāpaplašina basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Diemžēl saņemsim kļūdu, jo... sarakstā basic_information ir tāda paša nosaukuma kolonna basic_information. Ja rodas šāda kļūda, lai ātri noteiktu tās cēloni, varat izmantot names_repair = "unique":
Pēc tam varat tos pēc vajadzības pievienot atpakaļ sākotnējai datu kopai.
Secinājums
Līdz bibliotēkas kodolam tidyverse ietver daudzas noderīgas paketes, kuras vieno kopīga datu apstrādes filozofija.
Šajā rakstā mēs apskatījām funkciju saimi unnest_*(), kuru mērķis ir strādāt ar elementu izvilkšanu no ligzdotiem sarakstiem. Šajā pakotnē ir iekļautas daudzas citas noderīgas funkcijas, kas atvieglo datu konvertēšanu atbilstoši koncepcijai Tīri dati.