ProHoster > Blog > Verwaltung > Verschachtelte Spalten erweitern – Listen mit der R-Sprache (Tidyr-Paket und Funktionen der Unnest-Familie)
Verschachtelte Spalten erweitern – Listen mit der R-Sprache (Tidyr-Paket und Funktionen der Unnest-Familie)
Wenn Sie mit einer von einer API empfangenen Antwort oder mit anderen Daten mit komplexer Baumstruktur arbeiten, werden Sie in den meisten Fällen mit JSON- und XML-Formaten konfrontiert.
Diese Formate haben viele Vorteile: Sie speichern Daten recht kompakt und ermöglichen es Ihnen, unnötige Duplikate von Informationen zu vermeiden.
Der Nachteil dieser Formate ist die Komplexität ihrer Verarbeitung und Analyse. Unstrukturierte Daten können nicht in Berechnungen verwendet werden und eine Visualisierung kann nicht darauf aufgebaut werden.
Dieser Artikel ist eine logische Fortsetzung der Veröffentlichung „R-Paket „Tidr“ und seine neuen Funktionen „pivot_longer“ und „pivot_wider“. Mit dem Paket können Sie unstrukturierte Datenstrukturen in eine vertraute und für die Analyse geeignete tabellarische Form bringen tidyr, im Kern der Bibliothek enthalten tidyverseund seine Funktionsfamilie unnest_*().
Inhalt
Wenn Sie sich für Datenanalyse interessieren, könnten Sie an meiner interessiert sein Telegram mit и Youtube Kanäle. Der größte Teil des Inhalts ist der R-Sprache gewidmet.
Rechteckig(Anmerkung des Übersetzers: Ich habe für diesen Begriff keine passenden Übersetzungsmöglichkeiten gefunden, deshalb belassen wir es dabei.) ist der Prozess, unstrukturierte Daten mit verschachtelten Arrays in eine zweidimensionale Tabelle zu bringen, die aus bekannten Zeilen und Spalten besteht. IN tidyr Es gibt mehrere Funktionen, die Ihnen helfen, verschachtelte Listenspalten zu erweitern und die Daten auf eine rechteckige, tabellarische Form zu reduzieren:
unnest_longer() Nimmt jedes Element der Spaltenliste und erstellt eine neue Zeile.
unnest_wider() Nimmt jedes Element der Spaltenliste und erstellt eine neue Spalte.
unnest_auto() ermittelt automatisch, welche Funktion am besten geeignet ist unnest_longer() oder unnest_wider().
hoist() ähnlich zu unnest_wider() wählt jedoch nur die angegebenen Komponenten aus und ermöglicht das Arbeiten mit mehreren Verschachtelungsebenen.
Die meisten Probleme, die mit der Zusammenführung unstrukturierter Daten mit mehreren Verschachtelungsebenen in einer zweidimensionalen Tabelle verbunden sind, können durch die Kombination der aufgeführten Funktionen mit dplyr gelöst werden.
Um diese Techniken zu demonstrieren, verwenden wir das Paket repurrrsive, das mehrere komplexe, mehrstufige Listen bereitstellt, die von einer Web-API abgeleitet werden.
Beginnen wir mit gh_users, eine Liste, die Informationen über sechs GitHub-Benutzer enthält. Lassen Sie uns zunächst die Liste transformieren gh_users в Tibble rahmen:
users <- tibble( user = gh_users )
Das scheint ein wenig kontraintuitiv zu sein: Warum eine Liste bereitstellen? gh_users, zu einer komplexeren Datenstruktur? Ein Datenrahmen hat jedoch einen großen Vorteil: Er kombiniert mehrere Vektoren, sodass alles in einem Objekt verfolgt wird.
Jedes Objektelement users ist eine benannte Liste, in der jedes Element eine Spalte darstellt.
In diesem Fall haben wir eine Tabelle mit 30 Spalten, von denen wir die meisten nicht benötigen, also können wir sie stattdessen verwenden unnest_wider() verwenden hoist(). hoist() ermöglicht es uns, ausgewählte Komponenten mit derselben Syntax zu extrahieren wie 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() Entfernt die angegebenen benannten Komponenten aus einer Spaltenliste Benutzerdamit Sie darüber nachdenken können hoist() wie das Verschieben von Komponenten aus der internen Liste eines Datumsrahmens auf die oberste Ebene.
Github-Repositorys
Listenausrichtung gh_repos Wir beginnen auf ähnliche Weise mit der Konvertierung in tibble:
Diesmal die Elemente Benutzer stellt eine Liste der Repositorys dar, die diesem Benutzer gehören. Jedes Repository ist eine separate Beobachtung, entsprechend dem Konzept sauberer Daten (ca. ordentliche Daten) Sie sollten zu neuen Zeilen werden, weshalb wir sie verwenden unnest_longer() statt 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
Jetzt können wir es verwenden 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
Achten Sie auf die Verwendung c("owner", "login"): Dadurch können wir den Wert der zweiten Ebene aus einer verschachtelten Liste abrufen owner. Ein alternativer Ansatz besteht darin, die gesamte Liste abzurufen owner und dann die Funktion verwenden unnest_wider() Fügen Sie jedes seiner Elemente in eine Spalte ein:
Anstatt über die Wahl der richtigen Funktion nachzudenken unnest_longer() oder unnest_wider() du kannst verwenden unnest_auto(). Diese Funktion verwendet mehrere heuristische Methoden, um die am besten geeignete Funktion zur Transformation der Daten auszuwählen, und zeigt eine Meldung über die ausgewählte Methode an.
got_chars hat eine identische Struktur zu gh_users: Dies ist eine Reihe benannter Listen, wobei jedes Element der inneren Liste ein Attribut eines Game of Thrones-Charakters beschreibt. Bringen got_chars Für die Tabellenansicht erstellen wir zunächst wie in den vorherigen Beispielen einen Datumsrahmen und wandeln dann jedes Element in eine separate Spalte um:
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 etwas schwieriger als gh_users, Weil einige Listenkomponenten char selbst sind eine Liste, als Ergebnis erhalten wir Säulen - Listen:
Ihr weiteres Vorgehen richtet sich nach den Zielen der Analyse. Möglicherweise müssen Sie in den Zeilen für jedes Buch und jede Serie, in der die Figur vorkommt, Informationen angeben:
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 vielleicht möchten Sie eine Tabelle erstellen, die es Ihnen ermöglicht, den Charakter und das Werk zuzuordnen:
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
(Beachten Sie die leeren Werte "" im Bereich title, dies ist auf Fehler bei der Dateneingabe zurückzuführen got_chars: Tatsächlich handelt es sich um Charaktere, für die es in diesem Bereich keine entsprechenden Buch- und TV-Serientitel gibt title muss einen Vektor der Länge 0 haben, keinen Vektor der Länge 1, der die leere Zeichenfolge enthält.)
Wir können das obige Beispiel mit der Funktion umschreiben unnest_auto(). Dieser Ansatz eignet sich für einmalige Analysen, Sie sollten sich jedoch nicht darauf verlassen unnest_auto() für den regelmäßigen Gebrauch. Der Punkt ist, dass sich Ihre Datenstruktur ändert unnest_auto() kann den ausgewählten Datentransformationsmechanismus ändern, wenn die Listenspalten zunächst mit in Zeilen erweitert wurden unnest_longer()Wenn sich dann die Struktur der eingehenden Daten ändert, kann die Logik zu Ihren Gunsten geändert werden unnest_wider(), und die dauerhafte Verwendung dieses Ansatzes kann zu unerwarteten Fehlern führen.
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
Geokodierung mit Google
Als Nächstes betrachten wir eine komplexere Struktur der vom Geokodierungsdienst von Google erhaltenen Daten. Das Zwischenspeichern von Anmeldeinformationen verstößt gegen die Regeln für die Arbeit mit der Google Maps-API, daher schreibe ich zunächst einen einfachen Wrapper um die API. Dies basiert auf der Speicherung des Google Maps-API-Schlüssels in einer Umgebungsvariablen. Wenn Sie den Schlüssel zum Arbeiten mit der Google Maps API nicht in Ihren Umgebungsvariablen gespeichert haben, werden die in diesem Abschnitt vorgestellten Codefragmente nicht ausgeführt.
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)
}
Die Liste, die diese Funktion zurückgibt, ist recht komplex:
Glücklicherweise können wir das Problem der Umwandlung dieser Daten in eine tabellarische Form Schritt für Schritt mithilfe von Funktionen lösen tidyr. Um die Aufgabe etwas anspruchsvoller und realistischer zu gestalten, beginne ich mit der Geokodierung einiger Städte:
city <- c ( "Houston" , "LA" , "New York" , "Chicago" , "Springfield" ) city_geo <- purrr::map (city, geocode)
Ich werde das resultierende Ergebnis in konvertieren tibbleDer Einfachheit halber füge ich eine Spalte mit dem entsprechenden Stadtnamen hinzu.
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]>
Die erste Ebene enthält Komponenten status и result, mit dem wir erweitern 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
Bitte beachten Sie, dass results ist eine mehrstufige Liste. Die meisten Städte verfügen über ein Element (das einen eindeutigen Wert entsprechend der Geokodierungs-API darstellt), Springfield jedoch über zwei. Wir können sie mit in separate Zeilen ziehen 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
Jetzt haben sie alle die gleichen Komponenten, die mit überprüft werden können 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
Wir können die Breiten- und Längenkoordinaten jeder Stadt finden, indem wir die Liste erweitern 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>
Und dann der Standort, für den Sie expandieren müssen 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>
Nochmals, unnest_auto() vereinfacht den beschriebenen Vorgang mit einigen Risiken, die durch die Änderung der Struktur der eingehenden Daten entstehen können:
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>
Wir können uns auch einfach die erste Adresse jeder Stadt ansehen:
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 verwenden hoist() für einen mehrstufigen Tauchgang, zu dem man direkt weitergehen kann 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 von Sharla Gelfand
Abschließend betrachten wir die komplexeste Struktur – die Diskographie von Sharla Gelfand. Wie in den obigen Beispielen konvertieren wir zunächst die Liste in einen einspaltigen Datenrahmen und erweitern ihn dann, sodass jede Komponente eine separate Spalte darstellt. Außerdem transformiere ich die Spalte date_added in das entsprechende Datums- und Uhrzeitformat in R umwandeln.
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
Auf dieser Ebene erhalten wir Informationen darüber, wann jede CD zu Sharlas Diskografie hinzugefügt wurde, wir sehen jedoch keine Daten zu diesen CDs. Dazu müssen wir die Spalte erweitern basic_information:
discs %>% unnest_wider(basic_information)
#> Column name `id` must not be duplicated.
#> Use .name_repair to specify repair.
Leider erhalten wir eine Fehlermeldung, weil... innerhalb der Liste basic_information Es gibt eine gleichnamige Spalte basic_information. Wenn ein solcher Fehler auftritt, können Sie ihn verwenden, um die Ursache schnell zu ermitteln names_repair = "unique":
Das Problem ist, dass basic_information wiederholt die ID-Spalte, die ebenfalls auf der obersten Ebene gespeichert ist, sodass wir sie einfach entfernen können:
Anschließend können Sie sie bei Bedarf wieder mit dem Originaldatensatz verknüpfen.
Abschluss
Zum Kern der Bibliothek tidyverse umfasst viele nützliche Pakete, die durch eine gemeinsame Datenverarbeitungsphilosophie vereint sind.
In diesem Artikel haben wir die Funktionsfamilie untersucht unnest_*(), die darauf abzielen, Elemente aus verschachtelten Listen zu extrahieren. Dieses Paket enthält viele weitere nützliche Funktionen, die die Konvertierung von Daten gemäß dem Konzept erleichtern Ordentliche Daten.