0Pricing
R Academy · 강의

정돈된 평가: {{ }} 및 .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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 그룹별 요약과 group_by()
  2. 윈도 함수: lag, lead, cumsum
  3. dplyr의 다중 테이블 조인
  4. 정돈된 평가: {{ }} 및 .data
← R Academy(으)로 돌아가기