Evaluasi Rapi: {{ }} dan .data
Tulis fungsi dplyr yang menerima nama kolom sebagai argumen dengan aman.
Evaluasi Rapi: {{ }} dan .data 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.
Masalahnya: Pemrograman dengan dplyr
dplyr menggunakan evaluasi nonstandar (NSE) — nama kolom diteruskan tanpa tanda kutip. Ini praktis saat digunakan secara interaktif, tetapi rumit saat menulis fungsi. Bagaimana cara meneruskan nama kolom sebagai variabel ke fungsi dplyr?
library(dplyr)
df <- data.frame(x=1:5, y=c(2,4,6,8,10))
# Works fine interactively:
df %>% summarize(mean_x = mean(x))
# But what if 'x' is a variable?
col_name <- 'x'
# df %>% summarize(result = mean(col_name)) # WRONG! treats 'col_name' as column
cat('Need tidy evaluation to solve this!')Operator Embrace {{ }}
Di dalam fungsi, gunakan {{ col_var }} (disebut “kurung kurawal ganda” atau “embrace”) untuk meneruskan nama kolom yang akan dievaluasi dalam konteks kerangka data. Ini adalah pendekatan yang disarankan untuk sebagian besar pemrograman fungsi dplyr.
library(dplyr)
df <- data.frame(
group = c('A','A','B','B'),
sales = c(100, 120, 200, 180),
costs = c(60, 70, 110, 90)
)
# Function using {{ }}
group_mean <- function(data, group_col, value_col) {
data %>%
group_by({{ group_col }}) %>%
summarize(mean_val = mean({{ value_col }}), .groups = 'drop')
}
group_mean(df, group, sales)
group_mean(df, group, costs){{ }} untuk Nama Kolom pada Output
Anda juga dapat menggunakan {{ }} di sisi kiri := untuk memberi nama kolom output secara dinamis. Operator := (operator walrus) memungkinkan nama variabel di sisi kiri penugasan di dalam verba dplyr.
library(dplyr)
df <- data.frame(a=1:4, b=c(2,4,6,8))
# Dynamic output column name
compute_mean <- function(data, col) {
col_name <- paste0('mean_', deparse(substitute(col)))
data %>% summarize('{col_name}' := mean({{ col }}))
}
compute_mean(df, a)
compute_mean(df, b)Kata Ganti .data
.data[['col_name']] memungkinkan Anda memilih kolom menggunakan variabel string. Ini secara eksplisit memberi tahu dplyr untuk mencari kolom di kerangka data saat ini. Ini berguna ketika Anda memiliki nama kolom sebagai string karakter.
library(dplyr)
df <- data.frame(
name = c('Alice','Bob','Carol'),
score = c(85, 92, 78),
grade = c('B','A','C')
)
# Using .data with a string variable
get_summary <- function(data, col_name) {
data %>%
summarize(
n = n(),
mean_val = mean(.data[[col_name]])
)
}
get_summary(df, 'score')across() — Terapkan ke Beberapa Kolom
across(cols, fns) di dalam mutate() atau summarize() menerapkan fungsi ke beberapa kolom sekaligus. Pilih kolom dengan pembantu tidyselect: starts_with(), where(is.numeric), everything(), dan sebagainya.
library(dplyr)
df <- data.frame(
id = 1:3,
sales_q1 = c(100, 200, 150),
sales_q2 = c(120, 180, 160),
cost_q1 = c(60, 110, 80),
cost_q2 = c(70, 100, 85)
)
# Summarize all numeric columns except 'id'
df %>%
summarize(across(where(is.numeric) & !id, mean))across() dengan Fungsi Bernama
Teruskan daftar fungsi bernama ke across() untuk menghitung beberapa statistik per kolom. Kolom output diberi nama dalam format col_fn. Gunakan .names untuk menyesuaikan pola penamaan.
library(dplyr)
df <- data.frame(
x = c(10, 20, 30, 40),
y = c(5, 15, 25, 35)
)
# Compute mean and sd for both columns
df %>%
summarize(across(
c(x, y),
list(mean = mean, sd = sd),
.names = '{.col}_{.fn}'
))across() dalam mutate()
Menggunakan across() di dalam mutate() mengubah beberapa kolom secara bersamaan. Ini menghindari pengulangan transformasi yang sama untuk setiap kolom secara terpisah.
library(dplyr)
df <- data.frame(
id = 1:3,
revenue = c(1000, 2000, 1500),
cost = c(600, 1100, 800),
tax = c(100, 200, 150)
)
# Round all numeric columns except id to nearest 10
df %>%
mutate(across(where(is.numeric) & !id,
~round(., -2)))pick() — Pilih Kolom untuk Operasi
pick() (dplyr 1.1+) memilih sebagian kolom sebagai kerangka data mini, yang berguna untuk meneruskannya ke fungsi yang mengharapkan kerangka data. Fungsi ini bekerja di dalam mutate() dan summarize().
library(dplyr)
df <- data.frame(
id = 1:3,
a = c(1, 2, 3),
b = c(4, 5, 6),
c_val = c(7, 8, 9)
)
# Use pick() to compute row-wise mean across selected columns
df %>%
mutate(
row_mean = rowMeans(pick(a, b, c_val)),
row_max = do.call(pmax, pick(a, b, c_val))
)Menulis Fungsi dplyr yang Dapat Digunakan Kembali
Menggabungkan {{ }}, .data[[]], dan across() memungkinkan Anda menulis fungsi analisis yang kuat dan dapat digunakan kembali. Pola utamanya: terima nama kolom sebagai argumen tanpa tanda kutip (gunakan {{ }}) atau sebagai string (gunakan .data[[]]).
library(dplyr)
df <- data.frame(
region = c('East','East','West','West'),
product = c('A','B','A','B'),
revenue = c(100, 200, 150, 250),
units = c(10, 15, 12, 20)
)
# Flexible grouped summary function
group_stats <- function(data, ..., metric) {
data %>%
group_by(...) %>%
summarize(
total = sum({{ metric }}),
average = mean({{ metric }}),
.groups = 'drop'
)
}
group_stats(df, region, metric = revenue)
group_stats(df, region, product, metric = units)Pembantu Pemilihan Tidy
Pembantu tidyselect dapat digunakan di dalam across(), select(), dan pick(): starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate), dan everything().
library(dplyr)
df <- data.frame(
id = 1:3,
score_2022 = c(80,85,90),
score_2023 = c(82,88,91),
score_2024 = c(85,90,93),
category = c('A','B','A')
)
# Select all score columns and compute their means
df %>%
summarize(
across(starts_with('score'), mean),
n = n()
)Menggabungkan Pola Evaluasi Tidy
Fungsi dplyr di dunia nyata sering memadukan {{ }} untuk variabel pengelompokan, across() untuk beberapa metrik, dan .data[[]] untuk nama kolom berupa string. Memahami kapan setiap pola digunakan akan membuat kode Anda fleksibel dan benar.
library(dplyr)
df <- data.frame(
dept = c('HR','HR','Eng','Eng'),
salary = c(60000, 65000, 100000, 110000),
bonus = c(5000, 6000, 15000, 18000)
)
# String-based column selection with .data
summarize_column <- function(data, group_col, value_col_name) {
data %>%
group_by(.data[[group_col]]) %>%
summarize(
mean = mean(.data[[value_col_name]]),
total = sum(.data[[value_col_name]]),
.groups = 'drop'
)
}
summarize_column(df, 'dept', 'salary')
summarize_column(df, 'dept', 'bonus')Pemeriksaan Cepat
Di dalam fungsi khusus, bagaimana cara yang benar untuk meneruskan nama kolom sebagai argumen tanpa tanda kutip ke dplyr?
Ringkasan: Evaluasi Tidy
Hal-hal penting tentang pemrograman dengan dplyr:
{{ col }}— gunakan argumen nama kolom tanpa tanda kutip dalam fungsi.data[['col_name']]— akses kolom berdasarkan nama variabel berupa string- operator walrus
:=— gunakan dengan{{ }}atau string glue untuk nama output dinamis across(cols, fns)— terapkan fungsi ke beberapa kolom sekaliguspick(cols)— pilih kolom sebagai subkerangka data untuk operasi per baris- pembantu tidyselect:
starts_with(),where(),contains(),everything()
library(dplyr)
df <- data.frame(
group = c('A','A','B','B'),
v1 = c(10, 20, 30, 40),
v2 = c(5, 15, 25, 35)
)
# Reusable function using {{ }} + across
group_summary <- function(data, grp) {
data %>%
group_by({{ grp }}) %>%
summarize(across(where(is.numeric), list(mean=mean, sum=sum)), .groups='drop')
}
group_summary(df, group)Belajar R dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Evaluasi Rapi: {{ }} dan .data” gratis?
Ya — teks lengkap “Evaluasi Rapi: {{ }} dan .data” 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 “Evaluasi Rapi: {{ }} dan .data”?
Tulis fungsi dplyr yang menerima nama kolom sebagai argumen dengan aman. 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 “Evaluasi Rapi: {{ }} dan .data” 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
- Ringkasan Berkelompok dan group_by()
- Fungsi Jendela: lag, lead, cumsum
- Join Banyak Tabel dalam dplyr
- Evaluasi Rapi: {{ }} dan .data