1. ホーム
  2. r

[解決済み] data.frameのカラム名を関数に渡す

2022-05-06 21:06:07

質問

data.frameを受け取る関数を書こうとしているのですが( x ) と column を取得します。この関数は x に対していくつかの計算を行い、後で別の data.frame を返します。列名を関数に渡すためのベストプラクティスのメソッドに行き詰っています。

2つの最小限の例 fun1fun2 に対して操作を行えるようになり、望ましい結果が得られます。 x$column を使用しています。 max() を例として挙げました。しかし、どちらも一見(少なくとも私には)エレガントとは言い難い

  1. を呼び出す substitute() と、場合によっては eval()
  2. 列名を文字ベクトルとして渡す必要があること。

fun1 <- function(x, column){
  do.call("max", list(substitute(x[a], list(a = column))))
}

fun2 <- function(x, column){
  max(eval((substitute(x[a], list(a = column)))))
}

df <- data.frame(B = rnorm(10))
fun1(df, "B")
fun2(df, "B")

として関数を呼び出せるようにしたい。 fun(df, B) といった具合に。他のオプションも検討しましたが、試していません。

  • パス column をカラム番号の整数値で指定します。これによって substitute() . 理想的には、この関数はどちらかを受け入れることができます。
  • with(x, get(column)) が、しかし、仮にうまくいったとしても、これには substitute
  • を使用します。 formula()match.call() どちらもあまり経験がないのですが。

サブクエスチョン : です。 do.call() よりも優先される eval() ?

解決方法は?

カラム名を直接使用すればいいのです。

df <- data.frame(A=1:10, B=2:11, C=3:12)
fun1 <- function(x, column){
  max(x[,column])
}
fun1(df, "B")
fun1(df, c("B","A"))

substituteやevalなどを使う必要はない。

目的の関数をパラメータとして渡すこともできます。

fun1 <- function(x, column, fn) {
  fn(x[,column])
}
fun1(df, "B", max)

または [[ も、一度に1つの列を選択する場合に有効です。

df <- data.frame(A=1:10, B=2:11, C=3:12)
fun1 <- function(x, column){
  max(x[[column]])
}
fun1(df, "B")