Poiché si sta creando dinamicamente un nome di variabile come valore di carattere, ha più senso eseguire l'assegnazione utilizzando l'indicizzazione standard data.frame che consente valori di carattere per i nomi di colonna. Per esempio:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
La mutatefunzione semplifica la denominazione di nuove colonne tramite parametri denominati. Ma ciò 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 denominato.
versione dplyr> = 0.7
L'ultima versione di dplyr(0.7) lo fa usando usando:= per assegnare dinamicamente i nomi dei parametri. Puoi scrivere la tua funzione come:
# --- dplyr version 0.7+---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
mutate(df, !!varname := Petal.Width * n)
}
Per ulteriori informazioni, consultare il modulo di documentazione disponibile vignette("programming", "dplyr") .
dplyr (> = 0,3 e <0,7)
La 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 qui, la risposta è usare mutate_()piuttosto che mutate()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))
}
dplyr <0,3
Si noti che ciò è possibile anche nelle versioni precedenti di dplyrquelle esistenti al momento della domanda iniziale. Richiede un uso attento di quotee 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)
}