149

data.frame ( x) とcolumnそこから a を受け入れる関数を作成しようとしています。この関数は x に対していくつかの計算を実行し、後で別の data.frame を返します。列名を関数に渡すためのベストプラクティスの方法にこだわっています。

以下の 2 つの最小限の例fun1では、例としてを使用して、fun2に対して操作を実行でき、目的の結果が得られます。ただし、どちらも一見(少なくとも私にとっては)エレガントではないことに依存していますx$columnmax()

  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()ますか?

4

7 に答える 7

130

列名を直接使用できます。

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"))

代替、評価などを使用する必要はありません。

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

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")
于 2010-04-14T23:09:42.887 に答える
26

個人的には、列を文字列として渡すのはかなり見苦しいと思います。私は次のようなことをするのが好きです:

get.max <- function(column,data=NULL){
    column<-eval(substitute(column),data, parent.frame())
    max(column)
}

生成されるもの:

> get.max(mpg,mtcars)
[1] 33.9
> get.max(c(1,2,3,4,5))
[1] 5

data.frame の指定がオプションであることに注意してください。列の関数を操作することもできます:

> get.max(1/mpg,mtcars)
[1] 0.09615385
于 2010-04-15T01:36:43.090 に答える