2

これは些細なことだと思います。簡単な質問をして申し訳ありませんが、次の問題について助けていただければ幸いです。2 つの引数を必要とする関数があります。

myfun <- function(fm, name){
  ... 
}

使用するデータ フレームは、関数内で取得できdat <- eval(fm$call$data)ます。内部datには、2 番目の引数と同じ名前の変数があります。つまり、変数がありますdat$name(関数の 2 番目の引数には、データフレームへの参照が含まれていないことに注意してください。つまり、名前は等しくdat$nameなく、単に ですname)。その変数を使用します。

Q: どうすればできますか?

具体例: 以下は一例です。

  air <- data(airquality)
  fm <- lm(Ozone ~ Solar.R, data=airquality)
  myfun <- function(fm, name){
  df <- eval(fm$call$data)
  name[1:5]
  }

  myfun(fm, Temp)

この関数の目的は、nameフィッティングに使用されたデータフレーム内の変数の最初の 5 つの要素を表示することfmです。ただし、name対応するデータ フレームの変数として認識されません。でラップしてもwith(df, ...)df$name同等のソリューションでもうまくいきません。どうすれば機能しますか?

編集: もう少し遊んでみましたが、まだ機能していません。これは、いくつかのコメントに触発された後、うまくいくはずだと思ったものです。

  myfun <- function(fm, name){
  df <- as.character(fm$call$data)
  varname <- deparse(substitute(name))
  d1 <- paste(df, "$", sep="")
  d2 <- paste(d1, varname, sep="")
  get(d2)[1:5]
  }

  myfun(fm, Temp)

これにより、 という文字列が生成されairquality$Tempますが、次のエラーが表示 Error in get(d2): object 'airquality$Temp' not found. されgetます。 (

4

2 に答える 2

3

を使用したいのですgetが、data.frame がそこにあるという保証はありません。

> head(get(as.character(fm$call$data)), 5)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5

ただし、提供されるのはオブジェクトの名前as.character(fm$call$data))だけです。関数に渡すことができるその情報が既にある場合は、はるかに簡単に使用できますdata.frame

 head( get(Name), 5)

head は、最初の 5 つの要素だけでなく、最初の 5 つのを提供することに注意してください。

于 2013-05-14T15:17:37.040 に答える
2

あなたの例を使用して、

air <- data(airquality)
fm <- lm(Ozone ~ Solar.R, data=airquality)

myfun <- function(fm, name){
  dn <- fm$call[['data']]
  varname <- deparse(substitute(name))
  get(as.character(dn),envir=.GlobalEnv)[varname]
}

myfun(fm, Temp)
于 2013-05-14T16:47:24.387 に答える