我想编写一个函数,它将根据用户指定的关系生成一个新变量。例如,给定数据框:
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,除了,用户将指定"回归权重"。
答案 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)