R Academy · Leçon

Imbriquer et désimbriquer des data frames

Utilisez nest() et unnest() pour travailler avec des colonnes de listes dans des flux de travail tidy.

Leçon 4 sur 413 étapes

Imbriquer et désimbriquer des data frames est une leçon R Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage R Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours R Academy comprend 4 leçons au total.

Colonnes de listes et données imbriquées

Une colonne-liste est une colonne d'une trame de données dans laquelle chaque cellule contient un objet R (un vecteur, une trame de données, un modèle ou une liste). Cela permet de stocker des sous-données structurées à côté des autres colonnes et d'effectuer de puissants traitements par groupe.

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 element

nest() — Créer des trames de données imbriquées

nest(df, data = c(col1, col2)) regroupe les lignes selon les colonnes qui ne sont pas imbriquées et rassemble les colonnes indiquées dans une colonne-liste de trames de données. Vous obtenez une ligne par groupe, chacune contenant une mini-trame de données.

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 data

nest() avec group_by()

Schéma le plus courant : utilisez group_by(), puis nest() pour créer une ligne par groupe, toutes les colonnes restantes étant rassemblées dans une colonne-liste data. Cela équivaut à nest(.by = group_col) dans les versions plus récentes de 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() avec des trames de données imbriquées

Une fois les données imbriquées, utilisez purrr::map() pour appliquer une fonction à chaque mini-trame de données. La fonction reçoit une trame de données à la fois, et les résultats deviennent une nouvelle colonne-liste — souvent un modèle ajusté.

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)

Extraire les résultats des modèles avec map()

Après avoir ajusté des modèles pour chaque groupe, utilisez map() avec des fonctions comme broom::tidy() ou coef() pour extraire les résultats de chaque modèle. Le résultat est une autre colonne-liste qui pourra ensuite être désimbriquée.

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() — Développer les colonnes-listes

unnest(df, cols = data) est l'opposé de nest(). Cette fonction développe la colonne-liste pour la reconvertir en colonnes ordinaires, en répétant les colonnes d'identifiants si nécessaire. Utilisez cols pour indiquer la colonne-liste à désimbriquer.

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() — Développer une liste en lignes

unnest_longer(df, col) développe une colonne-liste afin que chaque élément de la liste devienne une ligne. Contrairement à unnest(), qui attend des trames de données, unnest_longer() fonctionne avec des listes de vecteurs ou de scalaires.

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() — Développer une liste en colonnes

unnest_wider(df, col) développe chaque élément d'une liste en un ensemble de nouvelles colonnes. La liste doit contenir des éléments nommés : ces noms deviennent les noms des colonnes. Cette fonction est utile pour les structures imbriquées de type JSON.

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)

Schéma complet de traitement des données imbriquées

Flux de travail complet pour les trames de données imbriquées : group_by() + nest() → appliquer des fonctions avec map() → extraire les résultats → unnest() pour revenir à une trame de données à plat. Ce schéma permet d'effectuer n'importe quelle analyse pour chaque groupe.

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)

Imbriquer plusieurs colonnes

Vous pouvez sélectionner précisément les colonnes qui doivent intégrer la trame de données imbriquée. Indiquez-les explicitement dans nest(data = c(...)). Les colonnes non indiquées restent des colonnes ordinaires de la trame de données externe, à côté de la colonne-liste.

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)

Quand utiliser des trames de données imbriquées

Les trames de données imbriquées sont particulièrement adaptées lorsque vous devez ajuster le même modèle pour plusieurs groupes, exécuter des simulations par groupe, appliquer des transformations complexes à des sous-ensembles ou travailler avec des données hiérarchiques de type JSON. Elles organisent les données propres à chaque groupe à côté des métadonnées au niveau du groupe.

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)

Vérification rapide

Quelle est la bonne manière de développer une colonne-liste de trames de données pour revenir à une trame de données à plat ?

Récapitulatif : imbrication et désimbrication

Points essentiels des flux de travail avec des trames de données imbriquées :

  • nest(data = c(cols)) — rassemble les colonnes dans une colonne-liste de trames de données, une par groupe
  • group_by() + nest() — schéma standard pour imbriquer les données par groupe
  • map(nested$data, fn) — applique une fonction à chaque trame de données imbriquée
  • unnest(cols = data) — développe une colonne-liste de trames de données pour revenir au format à plat
  • unnest_longer(col) — développe une liste de vecteurs/scalaires en lignes
  • unnest_wider(col) — développe une liste nommée en colonnes
  • Idéal pour la modélisation par groupe, l'amorçage statistique et le traitement de données JSON
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)
Gratuit pour commencer

Apprends R avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
43
Leçons
159

Questions Fréquemment Posées

La leçon « Imbriquer et désimbriquer des data frames » est-elle gratuite ?

Oui — le texte complet de « Imbriquer et désimbriquer des data frames » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours R Academy, passe à CoddyKit PRO. Le cours R Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Imbriquer et désimbriquer des data frames » ?

Utilisez nest() et unnest() pour travailler avec des colonnes de listes dans des flux de travail tidy. Tu pratiques R Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer R Academy ?

Aucune expérience préalable n'est requise. R Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Imbriquer et désimbriquer des data frames » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon R Academy ?

Oui. Chaque leçon R Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Du format large au format long avec pivot_longer()
  2. Du format long au format large avec pivot_wider()
  3. separate() et unite() pour les colonnes de chaînes
  4. Imbriquer et désimbriquer des data frames
← Retour à R Academy