Dal momento che si sta drammaticamente costruendo un nome di variabile come un valore di carattere, ha più senso fare assegnazione utilizzando l'indicizzazione data.frame standard che permette di valori dei caratteri per i nomi di colonna. Per esempio:
La funzione mutate
rende molto facile per citarne nuove colonne tramite parametri denominati. Ma questo presuppone che tu conosca il nome quando digiti il comando. Se si desidera specificare in modo dinamico il nome della colonna, è necessario creare anche l'argomento con nome.
L'ultima versione di dplyr (0.7) lo utilizza utilizzando :=
per assegnare dinamicamente i nomi dei parametri. È possibile scrivere la funzione come:
# --- dplyr version 0.7+---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
mutate(df, !!varname := Petal.Width * n)
}
Per ulteriori informazioni, vedere la documentazione disponibile sotto forma vignette("programming", "dplyr")
.
Una versione leggermente precedente di dplyr (> = 0.3 < 0.7), ha incoraggiato l'uso di alternative di "valutazione standard" a molte delle funzioni. Vedere la vignetta di valutazione non standard per ulteriori informazioni (vignette("nse")
).
Quindi, ecco, la risposta è quella di utilizzare mutate_()
piuttosto che mutate()
e fare:
# --- dplyr version 0.3-0.5---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
varval <- lazyeval::interp(~Petal.Width * n, n=n)
mutate_(df, .dots= setNames(list(varval), varname))
}
versioni precedenti di dplyr
notare che questo è possibile anche nelle versioni precedenti di dplyr esistenti al momento dell'avvio la domanda era originariamente posta Si richiede un uso attento di quote
e setName
:
# --- dplyr versions < 0.3 ---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
pp <- c(quote(df), setNames(list(quote(Petal.Width * n)), varname))
do.call("mutate", pp)
}
non sto insistendo su mutate, sto chiedendo se è possibile. Forse è solo un piccolo trucco che non conosco. Se c'è un altro modo, ascoltiamolo. –
credo che ci sia [uno spazio da guardare] (https://github.com/hadley/dplyr/issues/352#issuecomment-53829862) nel [pacchetto lazyeval] (https://github.com/hadley/lazyeval) – baptiste
a questo punto, 'dplyr' ha un [intera vignetta sulla valutazione non standard] (https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html) – Gregor