R Academy · Pelajaran

Evaluasi Rapi: {{ }} dan .data

Tulis fungsi dplyr yang menerima nama kolom sebagai argumen dengan aman.

Pelajaran 4 dari 413 langkah

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 sekaligus
  • pick(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)
Gratis untuk memulai

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

  1. Ringkasan Berkelompok dan group_by()
  2. Fungsi Jendela: lag, lead, cumsum
  3. Join Banyak Tabel dalam dplyr
  4. Evaluasi Rapi: {{ }} dan .data
← Kembali ke R Academy