ProHoster > Blog > Bestjoer > Nêste kolommen útwreidzje - listen mei de R-taal (tidyr-pakket en funksjes fan 'e unnest-famylje)
Nêste kolommen útwreidzje - listen mei de R-taal (tidyr-pakket en funksjes fan 'e unnest-famylje)
Yn 'e measte gefallen, as jo wurkje mei in antwurd ûntfongen fan in API, of mei oare gegevens dy't in komplekse beamstruktuer hawwe, wurde jo konfrontearre mei JSON- en XML-formaten.
Dizze formaten hawwe in protte foardielen: se bewarje gegevens frij kompakt en kinne jo ûnnedige duplikaasje fan ynformaasje foarkomme.
It neidiel fan dizze formaten is de kompleksiteit fan har ferwurking en analyse. Unstrukturearre gegevens kinne net brûkt wurde yn berekkeningen en fisualisaasje kin der net op boud wurde.
Dit artikel is in logyske fuortsetting fan 'e publikaasje "R-pakket tidyr en syn nije funksjes pivot_longer en pivot_wider". It sil jo helpe om unstruktureare gegevensstruktueren yn in fertroude en geskikt foar analyse tabelfoarm te bringen mei it pakket tidyr, opnommen yn 'e kearn fan' e bibleteek tidyverse, en syn famylje fan funksjes unnest_*().
Ynhâld
As jo ynteressearre binne yn gegevensanalyse, kinne jo miskien wêze ynteressearre yn myn telegram и youtube kanalen. It grutste part fan de ynhâld is wijd oan de R-taal.
Rjochthoekich(Opmerking fan 'e oersetter, ik fûn gjin adekwate oersetopsjes foar dizze term, dus wy litte it sa't it is.) is it proses fan it bringen fan ûnstrukturearre gegevens mei nestede arrays yn in twadiminsjonale tabel besteande út bekende rigen en kolommen. YN tidyr D'r binne ferskate funksjes dy't jo helpe om nestele listkolommen út te wreidzjen en de gegevens te ferminderjen nei in rjochthoekige, tabelfoarm:
unnest_longer() nimt elk elemint fan de kolom list en makket in nije rige.
unnest_wider() nimt elk elemint fan de kolom list en makket in nije kolom.
unnest_auto() bepaalt automatysk hokker funksje it bêste is om te brûken unnest_longer() of unnest_wider().
hoist() gelyk oan unnest_wider() mar selektearje allinnich de oantsjutte komponinten en kinne jo wurkje mei ferskate nivo fan nêst.
De measte fan 'e problemen dy't ferbûn binne mei it bringen fan unstrukturearre gegevens mei ferskate nivo's fan nêst yn in twadiminsjonale tabel kinne wurde oplost troch de neamde funksjes te kombinearjen mei dplyr.
Om dizze techniken te demonstrearjen, sille wy it pakket brûke repurrrsive, dy't meardere komplekse listen op meardere nivo's leveret dy't ôflaat binne fan in web API.
Litte wy begjinne mei gh_brûkers, in list dy't ynformaasje befettet oer seis GitHub-brûkers. Litte wy earst de list transformearje gh_brûkers в tibble frame:
users <- tibble( user = gh_users )
Dit liket in bytsje tsjinyntuïtyf: wêrom jouwe in list gh_brûkers, nei in mear komplekse gegevensstruktuer? Mar in gegevensframe hat in grut foardiel: it kombinearret meardere vectoren sadat alles yn ien objekt folge wurdt.
Elts objekt elemint users is in neamde list wêryn elk elemint in kolom stiet.
Yn dit gefal hawwe wy in tabel dy't bestiet út 30 kolommen, en wy sille de measte net nedich hawwe, dus kinne wy ynstee unnest_wider() brûke hoist(). hoist() lit ús selekteare komponinten ekstrahearje mei deselde syntaksis as 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() ferwideret de opjûne neamde komponinten út in kolomlist brûkersadat jo kinne beskôgje hoist() lykas it ferpleatsen fan komponinten fan 'e ynterne list fan in datumframe nei har boppeste nivo.
Github repositories
List alignment gh_repos wy begjinne fergelykber troch it konvertearjen nei tibble:
Dizze kear de eleminten brûker fertsjintwurdigje in list fan repositories eigendom fan dizze brûker. Elke repository is in aparte observaasje, dus neffens it konsept fan nette gegevens (sawat skjinne gegevens) se moatte wurde nije rigels, dat is wêrom wy brûke unnest_longer() mar net 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
No kinne wy brûke unnest_wider() of 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
Soarch omtinken foar it gebrûk c("owner", "login"): Hjirmei kinne wy de wearde fan it twadde nivo krije fan in nêste list owner. In alternative oanpak is om de hiele list te krijen owner en dan mei help fan de funksje unnest_wider() set elk fan syn eleminten yn in kolom:
Yn stee fan te tinken oer it kiezen fan de juste funksje unnest_longer() of unnest_wider() jo kinne brûke unnest_auto(). Dizze funksje brûkt ferskate heuristyske metoaden om de meast geskikte funksje te selektearjen foar it transformearjen fan de gegevens, en toant in berjocht oer de keazen metoade.
got_chars hat in identike struktuer oan gh_users: Dit is in set fan neamd listen, dêr't elk elemint fan 'e binnenste list beskriuwt guon attribút fan in Game of Thrones karakter. Bringe got_chars Foar de tabelwerjefte begjinne wy mei it meitsjen fan in datumframe, krekt lykas yn 'e foarige foarbylden, en konvertearje dan elk elemint yn in aparte kolom:
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>
struktuer got_chars wat dreger as gh_users, omdat guon list komponinten char sels binne in list, as gefolch krije wy pylders - listen:
Jo fierdere aksjes binne ôfhinklik fan de doelen fan 'e analyze. Miskien moatte jo ynformaasje op 'e rigels pleatse foar elk boek en searje wêryn it karakter ferskynt:
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
Of miskien wolle jo in tabel meitsje wêrmei jo it karakter en it wurk kinne oerienkomme:
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
(Let op de lege wearden "" yn fjild title, dit komt troch flaters makke by it ynfieren fan gegevens yn got_chars: feitlik karakters dêr't der gjin oerienkommende boek- en TV rige titels yn it fjild title moat in fektor fan lingte 0 hawwe, net in fektor fan lingte 1 mei de lege tekenrige.)
Wy kinne it boppesteande foarbyld opnij skriuwe mei de funksje unnest_auto(). Dizze oanpak is handich foar ienmalige analyze, mar jo moatte net fertrouwe op unnest_auto() foar gebrûk op in reguliere basis. It punt is dat as jo gegevensstruktuer feroaret unnest_auto() kin feroarje de selektearre gegevens transformaasje meganisme as it yn earste ynstânsje útwreide list kolommen yn rigen mei help unnest_longer(), dan as de struktuer fan 'e ynkommende gegevens feroaret, kin de logika yn it foardiel feroare wurde unnest_wider(), en it brûken fan dizze oanpak op in trochgeande basis kin liede ta ûnferwachte flaters.
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
Geokodearjen mei Google
Folgjende, wy sille sjen nei in mear komplekse struktuer fan de gegevens krigen fan Google syn geokodearjen tsjinst. Caching credentials is tsjin de regels fan wurkjen mei de Google maps API, dus ik sil earst in ienfâldige wrapper om de API skriuwe. Wat is basearre op it bewarjen fan de Google Maps API-kaai yn in omjouwingsfariabele; As jo de kaai net hawwe om te wurkjen mei de Google Maps API opslein yn jo omjouwingsfariabelen, wurde de koadefragminten presintearre yn dizze seksje net útfierd.
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)
}
Gelokkich kinne wy it probleem oplosse fan it konvertearjen fan dizze gegevens yn in tabelfoarm stap foar stap mei help fan funksjes tidyr. Om de taak in bytsje mear útdaagjend en realistysk te meitsjen, sil ik begjinne mei it geokodearjen fan in pear stêden:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Ik sil it resultearjende resultaat omsette yn tibble, foar it gemak sil ik in kolom tafoegje mei de byhearrende stêdnamme.
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]>
It earste nivo befettet komponinten status и result, dêr't wy mei útwreidzje kinne 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
notysje dat results is in multi-nivo list. De measte stêden hawwe 1 elemint (it fertsjintwurdiget in unike wearde dy't oerienkomt mei de geokodearjen API), mar Springfield hat twa. Wy kinne lûke se yn aparte rigels mei 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
No hawwe se allegear deselde komponinten, dy't kinne wurde ferifiearre mei help fan 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
Wy kinne de koördinaten fan 'e breedte- en lingtegraad fan elke stêd fine troch de list út te wreidzjen 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>
En dan de lokaasje wêrfoar jo moatte útwreidzje 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>
Al wer, unnest_auto() ferienfâldiget de beskreaune operaasje mei guon risiko's dy't kinne wurde feroarsake troch it feroarjen fan de struktuer fan 'e ynkommende gegevens:
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>
Wy kinne ek gewoan sjen nei it earste adres foar elke stêd:
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>
Of brûke hoist() foar in dûk op meardere nivo's om direkt nei te gean 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]>
Diskografy fan Sharla Gelfand
As lêste sille wy sjen nei de meast komplekse struktuer - de diskografy fan Sharla Gelfand. Lykas yn 'e foarbylden hjirboppe, wy begjinne mei it konvertearjen fan de list nei in single-kolom gegevens frame, en dan útwreidzje it sadat elke komponint is in aparte kolom. Ek transformearje ik de kolom date_added nei it passende datum- en tiidformaat yn 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
Op dit nivo krije wy ynformaasje oer wannear't elke skiif waard tafoege oan Sharla's diskografy, mar wy sjogge gjin gegevens oer dy skiven. Om dit te dwaan moatte wy de kolom útwreidzje basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Spitigernôch krije wy in flater, want... binnen de list basic_information der is in kolom mei deselde namme basic_information. As sa'n flater optreedt, om fluch fêst te stellen de oarsaak, kinne jo brûke names_repair = "unique":
Jo kinne se dan werom nei de oarspronklike dataset as nedich.
konklúzje
Oan 'e kearn fan 'e biblioteek tidyverse omfettet in protte nuttige pakketten ferienige troch in mienskiplike filosofy foar gegevensferwurking.
Yn dit artikel hawwe wy de famylje fan funksjes ûndersocht unnest_*(), dy't rjochte binne op it wurkjen mei it ekstrahearjen fan eleminten út nestele listen. Dit pakket befettet in protte oare nuttige funksjes dy't it makliker meitsje om gegevens te konvertearjen neffens it konsept Tidy Data.