Data Frames verschachteln und entpacken
Verwenden Sie nest() und unnest(), um in Tidy-Workflows mit List-Spalten zu arbeiten.
Data Frames verschachteln und entpacken ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Listenspalten und verschachtelte Daten
Eine Listenspalte ist eine Spalte in einem Data Frame, in deren einzelnen Zellen sich jeweils ein R-Objekt befindet (ein Vektor, Data Frame, ein Modell oder eine Liste). Dadurch können strukturierte Teildaten neben anderen Spalten gespeichert werden, was leistungsfähige gruppenweise Arbeitsabläufe ermöglicht.
library(tidyr)
library(dplyr)
# A simple data frame with a list-column
df <- data.frame(
group = c('A','B','C'),
n = c(3, 2, 4)
)
df$values <- list(c(1,2,3), c(4,5), c(6,7,8,9))
print(df)
print(df$values[[1]]) # Access the first list elementnest() — Verschachtelte Data Frames erstellen
nest(df, data = c(col1, col2)) gruppiert Zeilen nach den nicht verschachtelten Spalten und packt die angegebenen Spalten in eine Listenspalte mit Data Frames. Es entsteht eine Zeile pro Gruppe, die jeweils einen kleinen Data Frame enthält.
library(tidyr)
library(dplyr)
df <- data.frame(
region = c('East','East','East','West','West'),
month = c(1,2,3,1,2),
sales = c(100,120,110,200,190)
)
nested <- df %>%
nest(data = c(month, sales))
print(nested)
print(nested$data[[1]]) # East region's datanest() mit group_by()
Das häufigste Muster ist, zuerst group_by() und anschließend nest() zu verwenden, um eine Zeile pro Gruppe zu erstellen und alle übrigen Spalten in eine data-Listenspalte zu packen. In neueren tidyr-Versionen entspricht dies nest(.by = group_col).
library(tidyr)
library(dplyr)
df <- data.frame(
category = c('A','A','A','B','B','C','C','C','C'),
x = c(1,2,3,4,5,6,7,8,9),
y = c(2,4,3,8,7,5,6,9,8)
)
nested <- df %>%
group_by(category) %>%
nest()
print(nested)
cat('Rows per category B:', nrow(nested$data[[2]]))map() mit verschachtelten Data Frames
Nachdem die Daten verschachtelt wurden, verwenden Sie purrr::map(), um eine Funktion auf jeden kleinen Data Frame anzuwenden. Die Funktion erhält jeweils einen Data Frame; die Ergebnisse werden zu einer neuen Listenspalte, häufig mit einem angepassten Modell.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
group = c('A','A','A','B','B','B'),
x = c(1,2,3,1,2,3),
y = c(2.1,4.0,5.9,3.2,5.8,9.1)
)
models <- df %>%
group_by(group) %>%
nest() %>%
mutate(model = map(data, ~lm(y ~ x, data = .x)))
print(models)Modellergebnisse mit map() extrahieren
Nachdem Sie Modelle pro Gruppe angepasst haben, können Sie map() zusammen mit Funktionen wie broom::tidy() oder coef() verwenden, um Ergebnisse aus jedem Modell zu extrahieren. Die Ausgabe ist eine weitere Listenspalte, die später wieder entpackt werden kann.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
group = c('A','A','A','B','B','B'),
x = c(1,2,3,1,2,3),
y = c(2.1,4.0,5.9,3.2,5.8,9.1)
)
df %>%
group_by(group) %>%
nest() %>%
mutate(
model = map(data, ~lm(y ~ x, data = .x)),
r_squared = map_dbl(model, ~summary(.x)$r.squared),
intercept = map_dbl(model, ~coef(.x)[1]),
slope = map_dbl(model, ~coef(.x)[2])
) %>%
select(group, r_squared, intercept, slope)unnest() — Listenspalten erweitern
unnest(df, cols = data) ist die Umkehrung von nest(). Die Funktion erweitert die Listenspalte wieder zu regulären Spalten und wiederholt die Identifikatorspalten bei Bedarf. Mit cols geben Sie an, welche Listenspalte entpackt werden soll.
library(tidyr)
library(dplyr)
nested <- data.frame(
region = c('East','West')
)
nested$data <- list(
data.frame(month=1:3, sales=c(100,120,110)),
data.frame(month=1:2, sales=c(200,190))
)
unnested <- unnest(nested, cols = data)
print(unnested)unnest_longer() — Eine Liste in Zeilen erweitern
unnest_longer(df, col) erweitert eine Listenspalte, sodass jedes Listenelement zu einer Zeile wird. Anders als unnest(), das Data Frames erwartet, funktioniert unnest_longer() mit Listen aus Vektoren oder Einzelwerten.
library(tidyr)
df <- data.frame(
person = c('Alice','Bob','Carol')
)
df$skills <- list(
c('R','Python','SQL'),
c('Excel','Tableau'),
c('R','Julia','Stan','BUGS')
)
unnest_longer(df, skills)unnest_wider() — Eine Liste in Spalten erweitern
unnest_wider(df, col) erweitert jedes Listenelement zu mehreren neuen Spalten. Die Liste muss benannte Elemente enthalten; die Namen werden zu Spaltennamen. Das ist nützlich für verschachtelte JSON-ähnliche Strukturen.
library(tidyr)
df <- data.frame(id = 1:3)
df$info <- list(
list(name='Alice', age=30, city='NYC'),
list(name='Bob', age=25, city='LA'),
list(name='Carol', age=35, city='Chicago')
)
unnest_wider(df, info)Vollständiges Muster für verschachtelte Arbeitsabläufe
Der vollständige Arbeitsablauf für verschachtelte Data Frames: group_by() + nest() → Funktionen mit map() anwenden → Ergebnisse extrahieren → mit unnest() wieder einen flachen Data Frame erstellen. Dieses Muster ermöglicht Analysen für jede Gruppe.
library(tidyr)
library(dplyr)
library(purrr)
df <- data.frame(
region = c('East','East','East','West','West','West'),
month = c(1,2,3,1,2,3),
revenue = c(100,120,115,200,195,210)
)
df %>%
group_by(region) %>%
nest() %>%
mutate(
mean_rev = map_dbl(data, ~mean(.x$revenue)),
trend = map_dbl(data, ~coef(lm(revenue~month, data=.x))[2])
) %>%
select(region, mean_rev, trend)Mehrere Spalten verschachteln
Sie können gezielt festlegen, welche Spalten in den verschachtelten Data Frame aufgenommen werden. Geben Sie sie explizit in nest(data = c(...)) an. Nicht angegebene Spalten bleiben als reguläre Spalten im äußeren Data Frame neben der Listenspalte erhalten.
library(tidyr)
library(dplyr)
df <- data.frame(
region = c('East','East','West','West'),
year = c(2023,2024,2023,2024),
q1 = c(100,110,200,210),
q2 = c(105,115,195,215),
target = c(105,112,198,212)
)
# Only nest quarterly data, keep target as outer column
nested <- df %>%
group_by(region, year) %>%
nest(quarters = c(q1, q2))
print(nested)Wann verschachtelte Data Frames sinnvoll sind
Verschachtelte Data Frames eignen sich besonders, wenn Sie dasselbe Modell für mehrere Gruppen anpassen, Simulationen pro Gruppe ausführen, komplexe Transformationen auf Teilmengen anwenden oder mit JSON-ähnlichen hierarchischen Daten arbeiten möchten. Sie halten gruppenspezifische Daten zusammen mit Metadaten auf Gruppenebene übersichtlich organisiert.
library(tidyr)
library(dplyr)
library(purrr)
# Bootstrap confidence interval per group
df <- data.frame(
group = c('A','A','A','A','B','B','B','B'),
value = c(10,12,11,13,20,22,19,21)
)
set.seed(42)
df %>%
group_by(group) %>%
nest() %>%
mutate(
boot_means = map(data, function(d) {
replicate(100, mean(sample(d$value, replace=TRUE)))
}),
ci_low = map_dbl(boot_means, ~quantile(.x, 0.025)),
ci_high = map_dbl(boot_means, ~quantile(.x, 0.975))
) %>%
select(group, ci_low, ci_high)Schnelltest
Wie erweitern Sie eine Listenspalte mit Data Frames korrekt wieder zu einem flachen Data Frame?
Zusammenfassung: Verschachteln und Entpacken
Wichtige Punkte zu Arbeitsabläufen mit verschachtelten Data Frames:
nest(data = c(cols))— Spalten in eine Listenspalte mit Data Frames packen, einen pro Gruppegroup_by() + nest()— das Standardmuster zum Verschachteln nach Gruppenmap(nested$data, fn)— eine beliebige Funktion auf jeden verschachtelten Data Frame anwendenunnest(cols = data)— eine Listenspalte mit Data Frames wieder in ein flaches Format erweiternunnest_longer(col)— eine Liste aus Vektoren oder Einzelwerten in Zeilen erweiternunnest_wider(col)— eine benannte Liste in Spalten erweitern- Ideal für Modellierung pro Gruppe, Bootstrapping und die Verarbeitung von JSON-Daten
library(tidyr)
library(dplyr)
library(purrr)
data.frame(
team = c('A','A','B','B'),
x = c(1,2,1,2),
y = c(2,4,3,6)
) %>%
group_by(team) %>%
nest() %>%
mutate(
model = map(data, ~lm(y ~ x, data = .x)),
slope = map_dbl(model, ~coef(.x)['x'])
) %>%
select(team, slope)Häufig gestellte Fragen
Ist die Lektion „Data Frames verschachteln und entpacken“ kostenlos?
Ja — der vollständige Text von „Data Frames verschachteln und entpacken“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Data Frames verschachteln und entpacken“?
Verwenden Sie nest() und unnest(), um in Tidy-Workflows mit List-Spalten zu arbeiten. Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Data Frames verschachteln und entpacken“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Von Wide zu Long mit pivot_longer()
- Von Long zu Wide mit pivot_wider()
- separate() und unite() für String-Spalten
- Data Frames verschachteln und entpacken