この回答は既存の回答と同じ要素の多くをカバーしますが、この問題(列名を関数に渡す)は頻繁に発生するため、もう少し包括的にカバーする回答が必要でした。
非常に単純なデータフレームがあるとします。
dat <- data.frame(x = 1:4,
y = 5:8)
そしてz
、列x
との合計である新しい列を作成する関数を書きたいと思いますy
。
ここで非常に一般的な障害は、自然な(ただし正しくない)試みが次のようになることが多いことです。
foo <- function(df,col_name,col1,col2){
df$col_name <- df$col1 + df$col2
df
}
#Call foo() like this:
foo(dat,z,x,y)
ここでの問題はdf$col1
、式を評価しないことcol1
です。それは単にdf
文字通り呼び出されたで列を探しますcol1
。この動作については?Extract
、「再帰的(リストのような)オブジェクト」セクションで説明しています。
最も簡単で最も頻繁に推奨されるソリューションは、単純に$
toに切り替えて[[
、関数の引数を文字列として渡すことです。
new_column1 <- function(df,col_name,col1,col2){
#Create new column col_name as sum of col1 and col2
df[[col_name]] <- df[[col1]] + df[[col2]]
df
}
> new_column1(dat,"z","x","y")
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
これは、失敗するのが最も難しい方法であるため、「ベストプラクティス」と見なされることがよくあります。列名を文字列として渡すことは、あなたが得ることができるのと同じくらい明白です。
次の2つのオプションはより高度です。多くの一般的なパッケージはこの種の手法を利用していますが、微妙な複雑さと予期しない障害点が発生する可能性があるため、それらをうまく使用するには、より多くの注意とスキルが必要です。HadleyのAdvanced R本のこのセクションは、これらの問題のいくつかの優れたリファレンスです。
あなたがいる場合、実際にすべてのそれらの引用符を入力してからユーザーを保存したい、1つのオプションは、使用して文字列に裸、引用符で囲まれていない列名を変換するかもしれませんdeparse(substitute())
。
new_column2 <- function(df,col_name,col1,col2){
col_name <- deparse(substitute(col_name))
col1 <- deparse(substitute(col1))
col2 <- deparse(substitute(col2))
df[[col_name]] <- df[[col1]] + df[[col2]]
df
}
> new_column2(dat,z,x,y)
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
これは、率直に言って、おそらくばかばかしいことです。なぜなら、私たちは本当にと同じことをやっているからですnew_column1
。裸の名前を文字列に変換するための追加の作業がたくさんあるだけです。
最後に、本当に豪華にしたい場合は、追加する2つの列の名前を渡すのではなく、より柔軟にして2つの変数の他の組み合わせを許可することを決定する場合があります。その場合はeval()
、2つの列を含む式を使用することになります。
new_column3 <- function(df,col_name,expr){
col_name <- deparse(substitute(col_name))
df[[col_name]] <- eval(substitute(expr),df,parent.frame())
df
}
面白さのために、私はまだdeparse(substitute())
新しい列の名前に使用しています。ここでは、次のすべてが機能します。
> new_column3(dat,z,x+y)
x y z
1 1 5 6
2 2 6 8
3 3 7 10
4 4 8 12
> new_column3(dat,z,x-y)
x y z
1 1 5 -4
2 2 6 -4
3 3 7 -4
4 4 8 -4
> new_column3(dat,z,x*y)
x y z
1 1 5 5
2 2 6 12
3 3 7 21
4 4 8 32
したがって、短い答えは基本的に:data.frame列名を文字列として渡し、[[
単一の列を選択するために使用します。だけ掘り下げる始めるeval
、substitute
あなたが本当に何をやっている知っていれば、など。