정돈된 평가: {{ }} 및 .data
열 이름을 인수로 안전하게 받는 dplyr 함수를 작성합니다.
정돈된 평가: {{ }} 및 .data은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
문제: dplyr 프로그래밍
dplyr은 비표준 평가(NSE)를 사용하므로 열 이름을 따옴표 없이 전달합니다. 대화형으로 사용할 때는 편리하지만 함수를 작성할 때는 까다로울 수 있습니다. 열 이름을 변수로 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!'){{ }} 포괄 연산자
함수 안에서는 {{ col_var }}(‘중괄호 두 개’ 또는 ‘포괄’이라고 함)를 사용하여 데이터 프레임의 맥락에서 평가될 열 이름을 전달합니다. 대부분의 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)출력의 열 이름에 {{ }} 사용하기
:=의 왼쪽에도 {{ }}를 사용하여 출력 열의 이름을 동적으로 지정할 수 있습니다. := 연산자(바다코끼리 연산자)를 사용하면 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).data 대명사
.data[['col_name']]을 사용하면 문자열 변수로 열을 선택할 수 있습니다. 이 표현은 현재 데이터 프레임에서 열을 찾아야 한다고 dplyr에 명시적으로 알려 줍니다. 열 이름이 문자형 문자열로 저장되어 있을 때 유용합니다.
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() — 여러 열에 적용하기
mutate() 또는 summarize() 안에서 across(cols, fns)를 사용하면 여러 열에 함수를 한 번에 적용할 수 있습니다. tidyselect 도우미인 starts_with(), where(is.numeric), everything() 등으로 열을 선택합니다.
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() 사용하기
across()에 이름이 지정된 함수 목록을 전달하면 열마다 여러 통계량을 계산할 수 있습니다. 출력 열의 이름은 col_fn 형식으로 지정됩니다. 이름 지정 패턴을 사용자 지정하려면 .names를 사용합니다.
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}'
))mutate()에서 across() 사용하기
mutate() 안에서 across()를 사용하면 여러 열을 동시에 변환할 수 있습니다. 따라서 각 열에 같은 변환을 반복해서 적용하지 않아도 됩니다.
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() — 연산에 사용할 열 선택하기
pick()(dplyr 1.1 이상)은 열의 일부를 작은 데이터 프레임으로 선택하므로, 데이터 프레임을 입력으로 요구하는 함수에 전달할 때 유용합니다. mutate()와 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))
)재사용 가능한 dplyr 함수 작성하기
{{ }}, .data[[]], across()를 조합하면 강력하고 재사용 가능한 분석 함수를 작성할 수 있습니다. 핵심 패턴은 열 이름을 따옴표 없는 인수({{ }} 사용) 또는 문자열(.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)정돈된 선택 도우미
tidyselect 도우미는 across(), select(), pick() 안에서 사용할 수 있습니다: starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate), 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()
)정돈된 평가 패턴 조합하기
실제 dplyr 함수에서는 그룹 변수에 {{ }}, 여러 측정값에 across(), 문자열 열 이름에 .data[[]]를 함께 사용하는 경우가 많습니다. 각 패턴을 언제 사용할지 이해하면 코드를 유연하고 올바르게 작성할 수 있습니다.
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')빠른 확인
사용자 지정 함수 안에서 열 이름을 따옴표 없는 인수로 dplyr에 전달하는 올바른 방법은 무엇인가요?
복습: 정돈된 평가
dplyr 프로그래밍에서 기억할 핵심 내용:
{{ col }}— 함수에서 따옴표 없는 열 이름 인수를 포괄.data[['col_name']]— 문자열 변수 이름으로 열에 접근:=바다코끼리 연산자 — 동적 출력 이름에는{{ }}또는 글루 문자열과 함께 사용across(cols, fns)— 여러 열에 함수를 한 번에 적용pick(cols)— 행 단위 연산을 위해 열을 하위 데이터 프레임으로 선택- 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)자주 묻는 질문
“정돈된 평가: {{ }} 및 .data” 강의는 무료인가요?
네 — “정돈된 평가: {{ }} 및 .data” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“정돈된 평가: {{ }} 및 .data”에서 뭘 배우나요?
열 이름을 인수로 안전하게 받는 dplyr 함수를 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“정돈된 평가: {{ }} 및 .data” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 그룹별 요약과 group_by()
- 윈도 함수: lag, lead, cumsum
- dplyr의 다중 테이블 조인
- 정돈된 평가: {{ }} 및 .data