Tidy-arviointi: {{ }} ja .data
Kirjoittakaa dplyr-funktioita, jotka hyväksyvät sarakenimiä argumentteina turvallisesti.
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 nimiinacross(cols, fns)— sovella funktiota tai funktioita useisiin sarakkeisiin kerrallapick(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)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
- Ryhmitellyt yhteenvedot ja group_by()
- Ikkunafunktiot: lag, lead, cumsum
- Usean taulun joinit dplyr:ssä
- Tidy-arviointi: {{ }} ja .data