从数据框中调用变量,如`lm`

时间:2015-05-23 22:30:30

标签: r

我想编写一个函数,它将根据用户指定的关系生成一个新变量。例如,给定数据框:

d=structure(list(x1 = c(1.51402536388423, 2.46080908251235, 0.0820537335444602, 
0.397916902799275, 1.95703984456426, 0.339037316676135, -0.0983477082382985, 
-0.811438758653617, -0.22166264965645, -1.24251846727355), x2 = c(1.31813185688133, 
1.72398579121766, -0.193614904270392, 0.432834246728345, 1.59997674335209, 
0.600172345889666, -0.215380204258891, -0.561283409895365, 0.042565271836392, 
-1.19165094830462), x3 = c(0.811032464442614, 0.775382517472752, 
-0.513659338850135, 1.88476174946952, -0.609641201640788, -1.64673649834054, 
-2.0395881504007, -0.0752358173117906, -1.23648041024926, 2.4485419578765
)), .Names = c("x1", "x2", "x3"), row.names = c(NA, -10L), class = "data.frame")

用户可以指定y~.5*x1+.2*x2+.4*x3之类的内容来创建新变量y。对于一个变量来说,这很容易做到,但我不知道如何概括它。因此,

如何编写识别所选变量的函数并根据这些权重创建新变量?

我认为该函数将包含2个参数(NewVariable=function(model,data)),但我不确定下一步该做什么。

请注意,此问题类似于问题extract variables in formula from a data frame除了,用户将指定"回归权重"。

1 个答案:

答案 0 :(得分:0)

这是一个可能的解决方案:

modelFunction <- function(formula, data) {
  apply(data, 1, function(rw) {
    .e = environment()
    lapply(names(rw), function(varName) assign(x = varName, value = rw[varName], pos = .e))
    eval(formula)
  })
}

这样称呼:

y <- modelFunction(.5*x1+.2*x2+.4*x3, d)  # Note that the formula is unquoted

这也适用于互动条款。

编辑:

一个非常简洁的解决方案(由@MrFlick建议),使用envir函数的eval参数:

y <- eval(quote(.5*x1+.2*x2+.4*x3), d)