R Academy · Pelajaran

Menyarang dan Menyahsarangkan Bingkai Data

Gunakan nest() dan unnest() untuk bekerja dengan lajur senarai dalam aliran kerja tidy.

Pelajaran 4 daripada 413 langkah

Menyarang dan Menyahsarangkan Bingkai Data ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.

Lajur Senarai dan Data Bersarang

Lajur senarai ialah lajur dalam bingkai data yang setiap selnya mengandungi objek R, seperti vektor, bingkai data, model atau senarai. Ini membolehkan subdata berstruktur disimpan bersama lajur lain, sekali gus menyokong aliran kerja mengikut kumpulan yang berkuasa.

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() — Mencipta Bingkai Data Bersarang

nest(df, data = c(col1, col2)) mengumpulkan baris mengikut lajur yang tidak bersarang dan memadatkan lajur yang ditentukan ke dalam lajur senarai bingkai data. Terdapat satu baris bagi setiap kumpulan, dan setiap baris mengandungi bingkai data mini.

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() dengan group_by()

Pola yang paling biasa ialah menggunakan group_by() kemudian nest() untuk mencipta satu baris bagi setiap kumpulan, dengan semua lajur yang selebihnya dipadatkan ke dalam lajur senarai data. Ini setara dengan nest(.by = group_col) dalam versi tidyr yang lebih baharu.

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() dengan Bingkai Data Bersarang

Selepas data dijadikan bersarang, gunakan purrr::map() untuk menggunakan fungsi pada setiap bingkai data mini. Fungsi itu menerima satu bingkai data pada satu-satu masa, dan hasilnya menjadi lajur senarai baharu — selalunya model yang telah dipadankan.

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)

Mengekstrak Hasil Model dengan map()

Selepas memadankan model bagi setiap kumpulan, gunakan map() bersama fungsi seperti broom::tidy() atau coef() untuk mengekstrak hasil daripada setiap model. Outputnya ialah satu lagi lajur senarai yang kemudiannya boleh dinyahbersarang.

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() — Mengembangkan Lajur Senarai

unnest(df, cols = data) ialah songsangan kepada nest(). Fungsi ini mengembangkan lajur senarai kembali menjadi lajur biasa dan mengulangi lajur pengecam mengikut keperluan. Gunakan cols untuk menentukan lajur senarai yang hendak dinyahbersarang.

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() — Mengembangkan Senarai Menjadi Baris

unnest_longer(df, col) mengembangkan lajur senarai supaya setiap elemen senarai menjadi satu baris. Tidak seperti unnest() yang menjangkakan bingkai data, unnest_longer() berfungsi dengan senarai vektor atau skalar.

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() — Mengembangkan Senarai Menjadi Lajur

unnest_wider(df, col) mengembangkan setiap elemen senarai menjadi satu set lajur baharu. Senarai itu mestilah mempunyai elemen bernama — nama tersebut menjadi nama lajur. Ini berguna untuk struktur bersarang seperti 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)

Pola Aliran Kerja Bersarang Lengkap

Aliran kerja bingkai data bersarang yang lengkap: group_by() + nest() → gunakan fungsi dengan map() → ekstrak hasil → unnest() untuk kembali kepada bingkai data rata. Pola ini membolehkan sebarang analisis dijalankan bagi setiap kumpulan.

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)

Menjadikan Berbilang Lajur Bersarang

Anda boleh memilih lajur yang hendak dimasukkan ke dalam bingkai data bersarang. Tentukannya secara jelas dalam nest(data = c(...)). Lajur yang tidak ditentukan kekal sebagai lajur biasa dalam bingkai data luar, bersama lajur senarai.

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)

Bila Hendak Menggunakan Bingkai Data Bersarang

Bingkai data bersarang amat sesuai apabila anda perlu: memadankan model yang sama merentas kumpulan, menjalankan simulasi bagi setiap kumpulan, menggunakan transformasi kompleks pada subset atau bekerja dengan data hierarki seperti JSON. Bingkai ini memastikan data khusus kumpulan tersusun bersama metadata peringkat kumpulan.

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)

Semakan Pantas

Apakah cara yang betul untuk mengembangkan lajur senarai bingkai data kembali menjadi bingkai data rata?

Ringkasan: Menjadikan dan Menyahjadikan Bersarang

Perkara utama untuk aliran kerja bingkai data bersarang:

  • nest(data = c(cols)) — memadatkan lajur ke dalam lajur senarai bingkai data, satu bagi setiap kumpulan
  • group_by() + nest() — pola standard untuk menjadikan data bersarang mengikut kumpulan
  • map(nested$data, fn) — menggunakan sebarang fungsi pada setiap bingkai data bersarang
  • unnest(cols = data) — mengembangkan lajur senarai bingkai data kembali kepada format rata
  • unnest_longer(col) — mengembangkan senarai vektor/skalar menjadi baris
  • unnest_wider(col) — mengembangkan senarai bernama menjadi lajur
  • Sesuai untuk pemodelan mengikut kumpulan, pensampelan semula bootstrap dan pemprosesan data 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)
Percuma untuk bermula

Pelajari R dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
43
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Menyarang dan Menyahsarangkan Bingkai Data” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “Menyarang dan Menyahsarangkan Bingkai Data”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menyarang dan Menyahsarangkan Bingkai Data”?

Gunakan nest() dan unnest() untuk bekerja dengan lajur senarai dalam aliran kerja tidy. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan R Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Menyarang dan Menyahsarangkan Bingkai Data” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?

Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Lebar kepada Panjang dengan pivot_longer()
  2. Panjang kepada Lebar dengan pivot_wider()
  3. separate() dan unite() untuk Lajur Rentetan
  4. Menyarang dan Menyahsarangkan Bingkai Data
← Kembali ke R Academy