Tidy-evaluering: {{ }} og .data
Skriv dplyr-funksjoner som trygt tar imot kolonnenavn som argumenter.
Tidy-evaluering: {{ }} og .data er en gratis leksjon i R Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i R Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i R Academy inneholder totalt 4 leksjoner.
Problemet: programmering med dplyr
dplyr bruker non-standard evaluation (NSE) — kolonnenavn sendes inn uten anførselstegn. Dette er praktisk ved interaktiv bruk, men mer krevende når du skriver funksjoner. Hvordan sender du et kolonnenavn som en variabel til en dplyr-funksjon?
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!')Operatoren {{ }} for innbaking
Inne i en funksjon bruker du {{ col_var }} (kalt «curly-curly» eller «embrace») for å sende inn et kolonnenavn som skal evalueres i konteksten til dataframen. Dette er den anbefalte fremgangsmåten for de fleste dplyr-funksjoner du programmerer selv.
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){{ }} for kolonnenavn i resultatet
Du kan også bruke {{ }} på venstre side av := for å gi resultatkolonner dynamiske navn. Operatoren := (walrus-operatoren) tillater variabelnavn på venstre side av tilordninger inne i dplyr-verb.
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)Pronomenet .data
.data[['col_name']] lar deg velge en kolonne ved hjelp av en strengvariabel. Det forteller eksplisitt dplyr at kolonnen skal slås opp i den gjeldende dataframen. Dette er nyttig når du har kolonnenavn som tegnstrenger.
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() — Bruk på flere kolonner
across(cols, fns) inne i mutate() eller summarize() bruker en funksjon på flere kolonner samtidig. Velg kolonner med tidyselect-hjelpefunksjoner: starts_with(), where(is.numeric), everything() og så videre.
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() med navngitte funksjoner
Send en navngitt liste med funksjoner til across() for å beregne flere statistikker per kolonne. Resultatkolonnene får navn på formen col_fn. Bruk .names for å tilpasse navnemønsteret.
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() i mutate()
Når du bruker across() inne i mutate(), transformeres flere kolonner samtidig. Da slipper du å gjenta den samme transformasjonen for hver kolonne.
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() — Velg kolonner for operasjoner
pick() (dplyr 1.1+) velger et utvalg kolonner som en liten datafram, noe som er nyttig når du skal sende dem til funksjoner som forventer en datafram. Den fungerer inne i mutate() og 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))
)Skrive gjenbrukbare dplyr-funksjoner
Ved å kombinere {{ }}, .data[[]] og across() kan du skrive kraftige, gjenbrukbare analysefunksjoner. Hovedmønsteret er å ta imot kolonnenavn som argumenter uten anførselstegn (bruk {{ }}) eller som strenger (bruk .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)Hjelpefunksjoner for tidyselect
tidyselect-hjelpefunksjoner fungerer inne i across(), select() og pick(): starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate) og 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()
)Kombinere mønstre for tidy-evaluering
Praktiske dplyr-funksjoner kombinerer ofte {{ }} for grupperingsvariabler, across() for flere måltall og .data[[]] for kolonnenavn som strenger. Når du forstår når hvert mønster skal brukes, blir koden fleksibel og korrekt.
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')Hurtigsjekk
Hva er den riktige måten å sende et kolonnenavn som et argument uten anførselstegn til dplyr inne i en egendefinert funksjon?
Oppsummering: tidy-evaluering
Viktigste punkter om programmering med dplyr:
{{ col }}— bygg inn argumenter med kolonnenavn uten anførselstegn i funksjoner.data[['col_name']]— få tilgang til kolonner ved hjelp av et variabelnavn som streng:=-walrus-operatoren — bruk den med{{ }}eller glue-strenger for dynamiske resultatnavnacross(cols, fns)— bruk funksjon(er) på flere kolonner samtidigpick(cols)— velg kolonner som en underdatafram for radvise operasjoner- tidyselect-hjelpefunksjoner:
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)Lær deg R med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 43
- Leksjoner
- 159
Ofte stilte spørsmål
Er leksjonen «Tidy-evaluering: {{ }} og .data» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien R Academy, inkludert «Tidy-evaluering: {{ }} og .data», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i R Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Tidy-evaluering: {{ }} og .data»?
Skriv dplyr-funksjoner som trygt tar imot kolonnenavn som argumenter. Du øver på R Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med R Academy?
Ingen tidligere erfaring er nødvendig. R Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Tidy-evaluering: {{ }} og .data»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne R Academy-leksjonen?
Ja. Alle R Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Grupperte sammendrag og group_by()
- Vindusfunksjoner: lag, lead, cumsum
- Koblinger mellom flere tabeller i dplyr
- Tidy-evaluering: {{ }} og .data