Menyarangkan dan Membuka Sarang Data Frame
Gunakan nest() dan unnest() untuk bekerja dengan kolom daftar dalam alur kerja tidy.
Menyarangkan dan Membuka Sarang Data Frame adalah pelajaran R Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar R Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus R Academy mencakup 4 pelajaran total.
Kolom Daftar dan Data Bersarang
Kolom daftar adalah kolom dalam bingkai data yang setiap selnya berisi objek R (vektor, bingkai data, model, atau daftar). Ini memungkinkan Anda menyimpan subdata terstruktur bersama kolom lain, sehingga mendukung alur kerja berdasarkan kelompok yang kuat.
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() — Membuat Bingkai Data Bersarang
nest(df, data = c(col1, col2)) mengelompokkan baris berdasarkan kolom yang tidak disarangkan dan mengemas kolom yang ditentukan ke dalam kolom daftar berisi bingkai data. Setiap kelompok memiliki satu baris, yang berisi 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 datanest() dengan group_by()
Pola yang paling umum: gunakan group_by() lalu nest() untuk membuat satu baris per kelompok, dengan semua kolom yang tersisa dikemas ke dalam kolom daftar data. Ini setara dengan nest(.by = group_col) pada versi tidyr yang lebih baru.
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
Setelah data disarangkan, gunakan purrr::map() untuk menerapkan fungsi ke setiap bingkai data mini. Fungsi menerima satu bingkai data setiap kali, dan hasilnya menjadi kolom daftar baru—sering kali berupa model yang telah dipasangkan.
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()
Setelah memasangkan model untuk setiap kelompok, gunakan map() bersama fungsi seperti broom::tidy() atau coef() untuk mengekstrak hasil dari setiap model. Outputnya adalah kolom daftar lain yang nantinya dapat dibuka strukturnya.
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() — Memperluas Kolom Daftar
unnest(df, cols = data) adalah kebalikan dari nest(). Fungsi ini memperluas kolom daftar kembali menjadi kolom biasa, serta mengulang kolom pengenal sesuai kebutuhan. Gunakan cols untuk menentukan kolom daftar yang akan diperluas.
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() — Memperluas Daftar Menjadi Baris
unnest_longer(df, col) memperluas kolom daftar sehingga setiap elemen daftar menjadi satu baris. Berbeda dari unnest() yang mengharapkan bingkai data, unnest_longer() bekerja dengan daftar berisi 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() — Memperluas Daftar Menjadi Kolom
unnest_wider(df, col) memperluas setiap elemen daftar menjadi sekumpulan kolom baru. Daftar tersebut harus memiliki elemen bernama—namanya menjadi nama kolom. Ini berguna untuk struktur bersarang yang menyerupai 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 Alur Kerja Data Bersarang Lengkap
Alur kerja bingkai data bersarang yang lengkap: group_by() + nest() → terapkan fungsi dengan map() → ekstrak hasil → unnest() untuk kembali mendapatkan bingkai data datar. Pola ini memungkinkan Anda menjalankan analisis apa pun untuk setiap kelompok.
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)Menyarangkan Beberapa Kolom
Anda dapat memilih kolom mana saja yang akan dimasukkan ke dalam bingkai data bersarang. Tentukan kolom tersebut secara eksplisit dalam nest(data = c(...)). Kolom yang tidak ditentukan tetap menjadi kolom biasa dalam bingkai data luar, berdampingan dengan kolom daftar.
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)Kapan Menggunakan Bingkai Data Bersarang
Bingkai data bersarang sangat cocok ketika Anda perlu: memasangkan model yang sama pada berbagai kelompok, menjalankan simulasi per kelompok, menerapkan transformasi kompleks pada subset, atau bekerja dengan data hierarkis yang menyerupai JSON. Bingkai ini menjaga data khusus kelompok tetap terorganisasi bersama metadata tingkat kelompok.
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)Pemeriksaan Singkat
Bagaimana cara yang benar untuk memperluas kolom daftar berisi bingkai data kembali menjadi bingkai data datar?
Ringkasan: Menyarangkan dan Membuka Sederang
Hal-hal penting untuk alur kerja bingkai data bersarang:
nest(data = c(cols))— mengemas kolom ke dalam kolom daftar berisi bingkai data, satu untuk setiap kelompokgroup_by() + nest()— pola standar untuk menyarangkan data berdasarkan kelompokmap(nested$data, fn)— menerapkan fungsi apa pun ke setiap bingkai data bersarangunnest(cols = data)— memperluas kolom daftar berisi bingkai data kembali ke format datarunnest_longer(col)— memperluas daftar vektor/skalar menjadi barisunnest_wider(col)— memperluas daftar bernama menjadi kolom- Ideal untuk pemodelan per kelompok, bootstrap, dan pemrosesan 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)Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menyarangkan dan Membuka Sarang Data Frame” gratis?
Ya — teks lengkap “Menyarangkan dan Membuka Sarang Data Frame” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus R Academy, upgrade ke CoddyKit PRO. Kursus R Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menyarangkan dan Membuka Sarang Data Frame”?
Gunakan nest() dan unnest() untuk bekerja dengan kolom daftar dalam alur kerja tidy. Kamu berlatih R Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai R Academy?
Tidak diperlukan pengalaman sebelumnya. R Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Menyarangkan dan Membuka Sarang Data Frame” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dari Format Lebar ke Panjang dengan pivot_longer()
- Dari Format Panjang ke Lebar dengan pivot_wider()
- separate() dan unite() untuk Kolom String
- Menyarangkan dan Membuka Sarang Data Frame