R:如何使用“数据” - lm-formula的参数作为字符?

时间:2013-07-28 16:34:02

标签: r character formula lm objectname

我有一个问题,在度过周末之后,我想寻求帮助。为了解释这个问题,我想直接跳到一个例子中:

 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,])

我想回收模型的data-argument:

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

这给了我:

  df[df$z > 0, ]

但是,str(dat)会显示这是language类型的对象。但是,我想使用此表达式来访问lm中使用的数据帧(包括子设置),以获取另一个变量的相应值,例如f。请注意,将语言对象转换为带有as.character()的字符将导致字符向量,并且某些括号将丢失。

我想在函数中使用它,我想要的是这样的:

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

如果我将f指定为var.name,则不使用子设置,此过程会为变量f提供变量。通过子设置,我遇到parse的问题,因为dat现在是带括号的字符向量。

作为旁注:我想从data - 函数中回收lm - 参数而不是仅使用与var.name相同的表达式的原因是我改变了经常进行子设置,并且从lm-object中识别它使我的生活变得更加容易。它还会删除错误源。

如果有人能帮助我,我会感激不尽......

1 个答案:

答案 0 :(得分:3)

你可以像这样eval这个表达式

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