R Academy · Oppitunti

Tidy-arviointi: {{ }} ja .data

Kirjoittakaa dplyr-funktioita, jotka hyväksyvät sarakenimiä argumentteina turvallisesti.

Oppitunti 4/413 vaihetta

Tidy-arviointi: {{ }} ja .data on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

Ongelma: ohjelmointi dplyr:llä

dplyr käyttää epästandardia evaluointia (NSE) — sarakenimet välitetään ilman lainausmerkkejä. Tämä on kätevää vuorovaikutteisessa käytössä, mutta hankalaa funktioita kirjoitettaessa. Miten sarakkeen nimi välitetään muuttujana dplyr-funktiolle?

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!')

{{ }}-syleilyoperaattori

Käytä funktion sisällä ilmaisua {{ col_var }} (josta käytetään nimityksiä 'curly-curly' ja 'embrace'), kun haluat välittää sarakkeen nimen, joka evaluoidaan data kehyksen kontekstissa. Tämä on suositeltu tapa useimpiin dplyr-funktioiden ohjelmointitilanteisiin.

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)

{{ }} tulosteen sarakenimille

Voit käyttää {{ }}-ilmaisua myös operaattorin := vasemmalla puolella tulossarakkeiden nimeämiseen dynaamisesti. :=-operaattori (walrus-operaattori) sallii muuttujanimien käyttämisen sijoitusten vasemmalla puolella dplyr-verbeissä.

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)

The .data -viittaus

.data[['col_name']] mahdollistaa sarakkeen valitsemisen merkkijonomuuttujan avulla. Se kertoo dplyr:lle eksplisiittisesti, että saraketta etsitään nykyisestä data kehyksestä. Tämä on hyödyllistä, kun sarakkeiden nimet ovat merkkijonoina.

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() — Käytä useisiin sarakkeisiin

mutate()- tai summarize()-funktion sisällä käytettävä across(cols, fns) soveltaa funktiota useisiin sarakkeisiin kerralla. Valitse sarakkeet tidyselect-apufunktioilla: starts_with(), where(is.numeric), everything() ja niin edelleen.

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() nimettyjen funktioiden kanssa

Välitä across()-funktiolle nimetty funktioiden lista, jotta voit laskea useita tilastoja saraketta kohden. Tulossarakkeiden nimet muodostetaan muodossa col_fn. Mukauta nimeämismallia .names-argumentilla.

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() mutate()-funktiossa

across()-funktion käyttäminen mutate()-funktion sisällä muuntaa useita sarakkeita samanaikaisesti. Näin samaa muunnosta ei tarvitse toistaa jokaiselle sarakkeelle erikseen.

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() — Valitse sarakkeet operaatioita varten

pick() (dplyr 1.1+) valitsee sarakkeiden osajoukon pieneksi data kehykseksi, joka on hyödyllinen välitettäessä dataa data kehystä odottaville funktioille. Se toimii mutate()- ja summarize()-funktioiden sisällä.

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))
  )

Uudelleenkäytettävien dplyr-funktioiden kirjoittaminen

Yhdistämällä {{ }}-, .data[[]]- ja across()-ilmaisut voit kirjoittaa tehokkaita ja uudelleenkäytettäviä analyysifunktioita. Keskeinen toimintamalli on hyväksyä sarakenimet joko ilman lainausmerkkejä annettuina argumentteina (käytä {{ }}) tai merkkijonoina (käytä .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)

Tidy Selection -apufunktiot

tidyselect-apufunktiot toimivat across()-, select()- ja pick()-funktioissa: starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate) ja 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()
  )

Tidy Eval -mallien yhdistäminen

Käytännön dplyr-funktioissa yhdistetään usein {{ }} ryhmittelymuuttujiin, across() useisiin mittareihin ja .data[[]] merkkijonoina annettuihin sarakenimiin. Kun ymmärrät, milloin kutakin mallia käytetään, koodistasi tulee joustavaa ja oikein toimivaa.

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')

Pikatarkistus

Miten sarakkeen nimi välitetään mukautetussa funktiossa oikein dplyr:lle ilman lainausmerkkejä annettuna argumenttina?

Kertaus: Tidy Evaluation

dplyr-ohjelmoinnin tärkeimmät asiat:

  • {{ col }} — käytä funktioissa ilman lainausmerkkejä annettuja sarakenimiargumentteja
  • .data[['col_name']] — käytä sarakkeita merkkijonomuuttujan nimen perusteella
  • :=-walrus-operaattori — käytä sitä yhdessä {{ }}-ilmaisun tai glue-merkkijonojen kanssa tulossarakkeiden dynaamisiin nimiin
  • across(cols, fns) — sovella funktiota tai funktioita useisiin sarakkeisiin kerralla
  • pick(cols) — valitse sarakkeet alidata kehykseksi rivikohtaisia operaatioita varten
  • tidyselect-apufunktiot: 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)
Aloita maksutta

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Tidy-arviointi: {{ }} ja .data” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “Tidy-arviointi: {{ }} ja .data”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tidy-arviointi: {{ }} ja .data”?

Kirjoittakaa dplyr-funktioita, jotka hyväksyvät sarakenimiä argumentteina turvallisesti. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Tidy-arviointi: {{ }} ja .data”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ryhmitellyt yhteenvedot ja group_by()
  2. Ikkunafunktiot: lag, lead, cumsum
  3. Usean taulun joinit dplyr:ssä
  4. Tidy-arviointi: {{ }} ja .data
← Takaisin: R Academy