문제

I have a problem and after spending my weekend on it, I would like to ask for help. To explain the problem, I would like to directly jump into an example:

 df <- data.frame(x=rnorm(100), z=rnorm(100), y=rnorm(100), f=rep(1:5,length.out=100 ))
 mod <- lm(y ~ x, data=df[df$z>0,])

I want to recycle the data-argument of the model:

 dat <- mod$call[['data']]

This gives me:

  df[df$z > 0, ]

However, str(dat) will reveal that this is an object of type language. I want to use this expression, however, to access the dataframe that has been used in lm (including the sub-setting), to get the corresponding values of another variable, say f. Note that converting the language object into a character with as.character() will result in a character-vector, and some of the brackets will be lost.

I want to use this inside a function, and what I am looking for is something like this:

 foo <- function(fm, "var.name"){
      new <- paste(dat, "$", var.name, sep="")
      newvar <- eval(parse(text=new), envir=.GlobalEnv)
      ... do stuff with newvar ... 
 }

Without sub-setting, this procedure gives me the variable f if I specify var.name as f. With sub-setting, I run into problems with parse due to the fact that dat is now a character-vector with brackets.

As a side-note: the reason why I want to recycle the data-argument from the lm-function instead of just using the same expression with var.name is that I change the sub-setting quite often, and having it recognized from the lm-object makes my life much easier. It also removes a source of error.

I would be highly indebted if anyone could help me out here...

도움이 되었습니까?

해결책

You can just eval this expression like this

foo <- function(model, varname) eval(model$call[["data"]])[,varname]
foo(mod, "f")
##  [1] 2 5 2 5 1 2 1 5 2 3 1 2 3 1 3 4 1 3 4 1 2 3 2 4 1 4 1 2 4 5
## [31] 2 4 2 3 4 2 2 3 4 1 3 1 2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top