ProHoster > Blog > Administratioun > Erweidert nestet Kolonnen - Lëschte mat der R Sprooch (tidyr Package a Funktiounen vun der Unnest Famill)
Erweidert nestet Kolonnen - Lëschte mat der R Sprooch (tidyr Package a Funktiounen vun der Unnest Famill)
Am meeschte Fäll, wann Dir mat enger Äntwert vun enger API schafft, oder mat all aner Donnéeën, déi eng komplex Bamstruktur hunn, sidd Dir mat JSON an XML Formater konfrontéiert.
Dës Formater hu vill Virdeeler: Si späicheren Daten zimlech kompakt an erlaben Iech onnéideg Duplikatioun vun Informatioun ze vermeiden.
Den Nodeel vun dëse Formater ass d'Komplexitéit vun hirer Veraarbechtung an Analyse. Onstrukturéiert Daten kënnen net a Berechnunge benotzt ginn an d'Visualiséierung kann net drop gebaut ginn.
Dësen Artikel ass eng logesch Fortsetzung vun der Publikatioun "R Package tidyr a seng nei Funktiounen pivot_longer a pivot_wider". Et hëlleft Iech onstrukturéiert Datestrukturen an eng vertraut a gëeegent fir Analyse Tabellform mat dem Package ze bréngen tidyr, am Kär vun der Bibliothéik abegraff tidyverse, a seng Famill vu Funktiounen unnest_*().
Inhalt
Wann Dir un Donnéeën Analyse interesséiert sidd, kënnt Dir interesséiert meng Hëllefe profitéieren и YouTube Channels. De gréissten Deel vum Inhalt ass der R Sprooch gewidmet.
Rectangling(Notiz vum Iwwersetzer, ech hunn keng adäquat Iwwersetzungsoptioune fir dëse Begrëff fonnt, also loossen mir et sou wéi et ass.) ass de Prozess fir onstrukturéiert Donnéeën mat nestet Arrays an eng zweedimensional Tabell ze bréngen, déi aus vertraute Reihen a Kolonnen besteet. IN tidyr Et gi verschidde Funktiounen, déi Iech hëllefen, nestéiert Lëschtkolonnen auszebauen an d'Donnéeën op eng rechteckeg, tabulär Form ze reduzéieren:
unnest_longer() hëlt all Element vun der Kolonn Lëscht a kreéiert eng nei Zeil.
unnest_wider() hëlt all Element vun der Kolonn Lëscht a schaaft eng nei Kolonn.
unnest_auto() bestëmmt automatesch wéi eng Funktioun am beschten ass ze benotzen unnest_longer() oder unnest_wider().
hoist() ähnlech wéi unnest_wider() wielt awer nëmmen déi spezifizéiert Komponenten an erlaabt Iech mat verschiddenen Nistniveauen ze schaffen.
Déi meescht vun de Probleemer verbonne mat der Bréngung vun onstrukturéierten Donnéeën mat verschiddene Nestingsniveauen an eng zweedimensional Dësch kënnen geléist ginn andeems Dir déi opgelëscht Funktiounen mat dplyr kombinéiert.
Fir dës Techniken ze demonstréieren, benotze mir de Package repurrrsive, déi e puer komplex, Multi-Level Lëschte vun engem Web API ofgeleet.
Loosst eis mat gh_Benotzer, eng Lëscht déi Informatiounen iwwer sechs GitHub Benotzer enthält. Éischt loosst eis d'Lëscht transforméieren gh_Benotzer в tibbel Kader:
users <- tibble( user = gh_users )
Dëst schéngt e bësse kontraintuitiv: firwat eng Lëscht ubidden gh_Benotzer, zu enger méi komplexer Datestruktur? Awer en Dateframe huet e grousse Virdeel: et kombinéiert verschidde Vektoren sou datt alles an engem Objet verfollegt gëtt.
All Objet Element users ass eng benannt Lëscht an där all Element eng Kolonn duerstellt.
An dësem Fall hu mir en Dësch, deen aus 30 Sailen besteet, a mir brauchen déi meescht net, also kënne mir amplaz unnest_wider() benotzen hoist(). hoist() erlaabt eis ausgewielte Komponenten mat der selwechter Syntax ze extrahieren wéi 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() läscht déi spezifizéiert benannt Komponenten aus enger Kolonnlëscht Benotzersäitsou kënnt Dir betruecht hoist() wéi Komponente vun der interner Lëscht vun engem Datumrahmen op säin Topniveau ze bewegen.
Github Repositories
Lëscht Ausrichtung gh_repos mir fänken ähnlech mat der Ëmwandlung et zu tibble:
Dës Kéier d'Elementer Benotzersäit vertrieden eng Lëscht vun Repositories am Besëtz vun dësem Benotzer. All Repository ass eng separat Observatioun, also no dem Konzept vun ordentleche Daten (ongeféier ordentlech Donnéeën) se sollen nei Linnen ginn, dofir benotze mir unnest_longer() awer 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
Elo kënne mir benotzen unnest_wider() oder 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
Opgepasst op d'Benotzung c("owner", "login"): Dëst erlaabt eis den zweeten Niveau Wäert vun enger nested Lëscht ze kréien owner. Eng alternativ Approche ass déi ganz Lëscht ze kréien owner an dann d'Funktioun benotzt unnest_wider() setzt all seng Elementer an eng Kolonn:
Amplaz ze denken iwwer déi richteg Funktioun ze wielen unnest_longer() oder unnest_wider() Dir kënnt benotzen unnest_auto(). Dës Funktioun benotzt verschidde heuristesch Methoden fir déi gëeegent Funktioun fir d'Transformatioun vun den Donnéeën ze wielen, a weist e Message iwwer déi gewielte Method.
got_chars huet eng identesch Struktur ze gh_users: Dëst ass eng Rei vu genannte Lëschten, wou all Element vun der banneschter Lëscht e puer Attributer vun engem Game of Thrones Charakter beschreift. Matbréngen got_chars Fir d'Tabellevisioun fänken mir un mat engem Datumrahmen ze kreéieren, sou wéi an de fréiere Beispiller, an dann all Element an eng separat Kolonn konvertéieren:
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>
Struktur got_chars e bësse méi schwéier wéi gh_users, well puer Lëscht Komponente char selwer sinn eng Lëscht, als Resultat kréien mir Piliere - Lëschte:
Är weider Aktiounen hänkt vun den Ziler vun der Analyse of. Vläicht musst Dir Informatiounen iwwer d'Linnen fir all Buch a Serie setzen, an där de Charakter erschéngt:
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
Oder vläicht wëllt Dir en Dësch erstellen, deen Iech erlaabt de Charakter an d'Aarbecht ze passen:
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
(Notéiert déi eidel Wäerter "" am Feld title, Dëst ass wéinst Feeler gemaach beim Aginn vun Daten an got_chars: Tatsächlech Personnagen fir déi et keng entspriechend Buch- an TV-Serientitelen am Beräich sinn title muss e Vektor vun der Längt 0 hunn, net e Vektor vun der Längt 1 mat der eidel String.)
Mir kënnen dat uewe genannte Beispill iwwerschreiwe mat der Funktioun unnest_auto(). Dës Approche ass bequem fir eng eemoleg Analyse, awer Dir sollt net op vertrauen unnest_auto() fir regelméisseg ze benotzen. De Punkt ass datt wann Är Datestruktur ännert unnest_auto() kann den ausgewielten Datetransformatiounsmechanismus änneren wann et am Ufank d'Lëschtkolonnen a Reihen erweidert benotzt unnest_longer(), dann wann d'Struktur vun den erakommen Donnéeën ännert, kann d'Logik zugonschte geännert ginn unnest_wider(), a benotzt dës Approche op eng kontinuéierlech Basis kann zu onerwaarte Feeler féieren.
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 mat Google
Als nächst wäerte mir eng méi komplex Struktur vun den Daten aus dem Google Geokodéierungsservice kréien. Caching Umeldungsinformatiounen ass géint d'Regele fir mat der Google Maps API ze schaffen, also wäert ech als éischt en einfache Wrapper ronderëm d'API schreiwen. Wat baséiert op der Späichere vum Google Maps API Schlëssel an enger Ëmfeldvariabel; Wann Dir net de Schlëssel hutt fir mat der Google Maps API ze schaffen, déi an Ären Ëmfeldvariablen gespäichert ass, ginn d'Codefragmenter, déi an dëser Sektioun presentéiert ginn, net ausgefouert.
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)
}
D'Lëscht déi dës Funktioun zréckkënnt ass zimlech komplex:
Glécklecherweis kënne mir de Problem léisen fir dës Donnéeën an eng Tabellform Schrëtt fir Schrëtt ze konvertéieren mat Funktiounen tidyr. Fir d'Aufgab e bësse méi Erausfuerderung a realistesch ze maachen, fänken ech un e puer Stied ze geocodéieren:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Ech konvertéieren dat resultéierend Resultat an tibble, Fir d'Bequemlechkeet wäert ech eng Kolonn mat dem entspriechende Stadnumm derbäisetzen.
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]>
Den éischte Niveau enthält Komponenten status и result, mat deene mer ausbaue kënnen 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
notéiert dat results ass eng Multi-Level Lëscht. Déi meescht Stied hunn 1 Element (representéiert en eenzegaartege Wäert entsprécht der geocoding API), awer Springfield huet zwee. Mir kënnen hinnen an separat Linnen zitt mat 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
Elo hunn se all déiselwecht Komponenten, déi kënne verifizéiert ginn mat Hëllef 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
Mir kënnen d'Breet- a Längtegrad Koordinate vun all Stad fannen andeems Dir d'Lëscht erweidert 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>
An dann d'Plaz fir déi Dir musst ausbauen 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>
An nach eng Kéier. unnest_auto() vereinfacht déi beschriwwe Operatioun mat e puer Risiken, déi duerch d'Verännerung vun der Struktur vun den erakommen Daten verursaacht kënne ginn:
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>
Mir kënnen och just déi éischt Adress fir all Stad kucken:
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>
Oder benotzen hoist() fir eng Multi-Niveau daucht direkt op 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]>
Diskographie vum Sharla Gelfand
Endlech wäerte mir déi komplex Struktur kucken - d'Discographie vum Sharla Gelfand. Wéi an de Beispiller hei uewen, fänken mir un d'Lëscht an eng eenzeg Kolonn Dateframe ëmzewandelen, an dann ausbauen sou datt all Komponent eng separat Kolonn ass. Och transforméieren ech d'Kolonn date_added op de passenden Datum an Zäit Format am 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 dësem Niveau kréie mir Informatiounen iwwer wéini all Disc zu Sharla senger Diskographie bäigefüügt gouf, awer mir gesinn keng Daten iwwer dës Discs. Fir dëst ze maachen, musse mir d'Kolonn erweideren basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Leider kréie mir e Feeler, well... bannent der Lëscht basic_information et gëtt eng Kolonn mam selwechten Numm basic_information. Wann esou e Feeler geschitt, fir séier seng Ursaach ze bestëmmen, kënnt Dir benotzen names_repair = "unique":
Dir kënnt se dann zréck an den ursprénglechen Datesaz verbannen wéi néideg.
Konklusioun
An de Kär vun der Bibliothéik tidyverse enthält vill nëtzlech Packagen vereenegt vun enger gemeinsamer Dateveraarbechtungsphilosophie.
An dësem Artikel hu mir d'Famill vun de Funktiounen ënnersicht unnest_*(), déi zielt fir ze schaffen mat Elementer aus nestéierte Lëschten ze extrahieren. Dëse Package enthält vill aner nëtzlech Funktiounen déi et méi einfach maachen Daten no dem Konzept ze konvertéieren Uerdentlech Daten.