R Academy · leksjon

Tidy-evaluering: {{ }} og .data

Skriv dplyr-funksjoner som trygt tar imot kolonnenavn som argumenter.

Leksjon 4 av 413 trinn

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 resultatnavn
  • across(cols, fns) — bruk funksjon(er) på flere kolonner samtidig
  • pick(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)
Gratis å komme i gang

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

  1. Grupperte sammendrag og group_by()
  2. Vindusfunksjoner: lag, lead, cumsum
  3. Koblinger mellom flere tabeller i dplyr
  4. Tidy-evaluering: {{ }} og .data
← Tilbake til R Academy