Kapsla in och packa upp data frames
Använd nest() och unnest() för att arbeta med listkolumner i tidy-arbetsflöden.
Kapsla in och packa upp data frames är en gratis lektion i R Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för R Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i R Academy innehåller totalt 4 lektioner.
Listkolumner och nästlade data
En listkolumn är en kolumn i en data frame där varje cell innehåller ett R-objekt (en vektor, data frame, modell eller lista). Det gör det möjligt att lagra strukturerade underdata tillsammans med andra kolumner och möjliggör kraftfulla arbetsflöden per grupp.
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() — Skapa nästlade data frames
nest(df, data = c(col1, col2)) grupperar rader efter de kolumner som inte nästlas och packar de angivna kolumnerna i en listkolumn med data frames. Det blir en rad per grupp, där varje rad innehåller en liten data frame.
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() med group_by()
Det vanligaste mönstret är att använda group_by() och sedan nest() för att skapa en rad per grupp, där alla återstående kolumner packas i en data-listkolumn. Det motsvarar nest(.by = group_col) i nyare versioner av tidyr.
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() med nästlade data frames
När data har nästlats kan du använda purrr::map() för att tillämpa en funktion på varje liten data frame. Funktionen tar emot en data frame i taget och resultaten blir en ny listkolumn — ofta en anpassad 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)Extrahera modellresultat med map()
När du har anpassat modeller per grupp kan du använda map() tillsammans med funktioner som broom::tidy() eller coef() för att extrahera resultat från varje modell. Utdata blir ytterligare en listkolumn som senare kan packas upp.
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() — Packa upp listkolumner
unnest(df, cols = data) är motsatsen till nest(). Den expanderar listkolumnen tillbaka till vanliga kolumner och upprepar vid behov identifierarkolumnerna. Använd cols för att ange vilken listkolumn som ska packas upp.
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() — Expandera en lista till rader
unnest_longer(df, col) expanderar en listkolumn så att varje element i listan blir en rad. Till skillnad från unnest(), som förväntar sig data frames, fungerar unnest_longer() med listor av vektorer eller skalärer.
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() — Expandera en lista till kolumner
unnest_wider(df, col) expanderar varje listelement till en uppsättning nya kolumner. Listan måste ha namngivna element — namnen blir kolumnnamn. Det är användbart för nästlade JSON-liknande strukturer.
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)Fullständigt arbetsflöde för nästlade data
Det kompletta arbetsflödet för nästlade data frames: group_by() + nest() → tillämpa funktioner med map() → extrahera resultat → unnest() för att återgå till en platt data frame. Mönstret gör det möjligt att köra valfri analys per grupp.
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)Nästla flera kolumner
Du kan själv välja vilka kolumner som ska ingå i den nästlade data framen. Ange dem uttryckligen i nest(data = c(...)). Kolumner som inte anges förblir vanliga kolumner i den yttre data framen, bredvid listkolumnen.
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)När ska nästlade data frames användas
Nästlade data frames är särskilt användbara när du behöver anpassa samma modell för flera grupper, köra simuleringar per grupp, tillämpa komplexa transformationer på delmängder eller arbeta med JSON-liknande hierarkiska data. De håller gruppspecifika data organiserade tillsammans med metadata på gruppnivå.
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)Snabb kontroll
Vad är det korrekta sättet att expandera en listkolumn med data frames tillbaka till en platt data frame?
Sammanfattning: nästla och packa upp
Viktigast att komma ihåg om arbetsflöden med nästlade data frames:
nest(data = c(cols))packar kolumner i en listkolumn med data frames, en per gruppgroup_by() + nest()— standardmönstret för att nästla efter gruppmap(nested$data, fn)— tillämpar valfri funktion på varje nästlad data frameunnest(cols = data)— expanderar en listkolumn med data frames tillbaka till platt formunnest_longer(col)— expanderar en lista med vektorer eller skalärer till raderunnest_wider(col)— expanderar en namngiven lista till kolumner- Idealiskt för modellering per grupp, bootstrap och bearbetning av JSON-data
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)Lär dig R med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 43
- Lektioner
- 159
Vanliga frågor
Är lektionen ”Kapsla in och packa upp data frames” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen R Academy, inklusive ”Kapsla in och packa upp data frames”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i R Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kapsla in och packa upp data frames”?
Använd nest() och unnest() för att arbeta med listkolumner i tidy-arbetsflöden. Ni övar på R Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig R Academy?
Du behöver inga förkunskaper. Utbildningen i R Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Kapsla in och packa upp data frames”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här R Academy-lektionen?
Ja. Varje R Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Från brett till långt med pivot_longer()
- Från långt till brett med pivot_wider()
- separate() och unite() för strängkolumner
- Kapsla in och packa upp data frames