変数名を文字値として動的に構築しているので、列名に文字値を許可する標準のdata.frameインデックスを使用して代入を行う方が理にかなっています。例えば:
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
このmutate
関数により、名前付きパラメーターを介して新しい列に名前を付けることが非常に簡単になります。ただし、コマンドを入力したときに名前がわかっていることを前提としています。列名を動的に指定する場合は、名前付き引数も作成する必要があります。
dplyrバージョン> = 0.7
dplyr
(0.7)の最新バージョンでは、を使用して:=
パラメーター名を動的に割り当てることでこれを行います。関数は次のように記述できます。
# --- dplyr version 0.7+---
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
mutate(df, !!varname := Petal.Width * n)
}
詳細については、ドキュメントの利用可能なフォームを参照してくださいvignette("programming", "dplyr")
。
dplyr(> = 0.3&<0.7)
少し前のバージョンdplyr
(> = 0.3 <0.7)では、多くの関数に対する「標準評価」の代替の使用が推奨されていました。詳細については、非標準の評価ビネットを参照してください(vignette("nse")
)。
したがって、ここでは、答えはではmutate_()
なく、使用するmutate()
ことです:
# --- 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
これはdplyr
、質問が最初に提起されたときに存在していた古いバージョンでも可能です。それは慎重に使用する必要がありますquote
と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)
}