[解決済み] `dplyr`で新しいカラム/変数に動的な名前を使用する
質問
を使いたいのですが
dplyr::mutate()
を使用して、データフレームに複数の新しい列を作成します。列名とその内容は動的に生成される必要があります。
虹彩のデータ例。
library(dplyr)
iris <- as_tibble(iris)
新しいカラムを変異させるための関数を
Petal.Width
変数を使用します。
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df <- mutate(df, varname = Petal.Width * n) ## problem arises here
df
}
ここで、カラムを構築するためのループを作成します。
for(i in 2:5) {
iris <- multipetal(df=iris, n=i)
}
しかし、mutate は varname をリテラルな変数名とみなしているので、ループは4つの新しい変数(petal.2 - petal.5 と呼ばれる)ではなく、1つの新しい変数(varname と呼ばれる)を作成するだけです。
どうすれば
mutate()
を使うと、ダイナミック名を変数名として使用できますか?
どのように解決するのですか?
変数名を文字値として動的に構築しているので、列名に文字値を使用できる標準的な data.frame インデックスを使用して割り当てを行う方がより理にかなっています。例えば、以下のようになります。
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df[[varname]] <- with(df, Petal.Width * n)
df
}
は
mutate
関数を使用すると、名前付きパラメータを使用して新しいカラムに名前を付けるのが非常に簡単になります。しかし、これはコマンドを入力するときに名前を知っていることが前提です。もしカラム名を動的に指定したいのであれば、名前付き引数も作成する必要があります。
dplyr バージョン >= 1.0
dplyrの最新バージョンでは、この構文で
glue
パッケージを使用している場合、パラメータに名前を付ける際に
:=
. そのため、ここでは
{}
の中にある式を評価することによって値を取得します。
multipetal <- function(df, n) {
mutate(df, "petal.{n}" := Petal.Width * n)
}
関数にカラム名を渡す場合は
{{}}
という文字列を、カラム名と同様に
meanofcol <- function(df, col) {
mutate(df, "Mean of {{col}}" := mean({{col}}))
}
meanofcol(iris, Petal.Width)
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)
}
関連
-
[解決済み】R: 複数行の ggplot2 コマンドで「単項演算子エラー」が発生する。
-
[解決済み】数学関数への非数値引数
-
[解決済み】ggplotの線幅を変更するには?
-
[解決済み】プロット時に 'x' と 'y' の長さが異なる ERROR が発生する。
-
[解決済み】apply()とadply()の出力が異なる件)
-
[解決済み】rbind(deparse.level, ...)でエラー:引数の列の数がRにマッチしていない
-
[解決済み】R 置換する項目数が置換長の倍数でない/しかし結果は正しい
-
[解決済み】Rで結果の行数がベクトル長(arg 2)の倍数でない件
-
[解決済み】dplyr: "Error in n(): 関数は直接呼ばれるべきではありません"
-
[解決済み】起動時にパーをデフォルト値にリセットする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 変数の型(リスト)が無効です
-
[解決済み】添え字付き代入でNAを使用することはできません
-
[解決済み】rbind エラー。"名前が以前の名前と一致しない"
-
[解決済み】x[[i]]でのエラー:レベル2で再帰的インデックス作成に失敗した
-
[解決済み】「'dimnames' [1]の長さが配列の範囲と等しくない」とはどういう意味ですか?
-
[解決済み】ロジスティック回帰 - eval(family$initialize) : y 値は 0 <= y <= 1 である必要があります。
-
[解決済み】二項演算子への非数値引数【非公開
-
[解決済み】R4DSのエラー比較(1)は、アトミック型とリスト型でのみ可能です
-
[解決済み】Rでmax.printの制限値を増やす方法
-
[解決済み】起動時にパーをデフォルト値にリセットする方法