我真的很难理解为什么此功能不起作用。 这只是一个返回简单线性模型系数的函数:
prime 10^9+7
现在我创建任何随机数据集:
lmfunction <- function(data,y,x,index){
return(coef(lm(y~x,data=data,subset=index)))
}
当我尝试在数据集上运行该函数时,出现以下错误:
dataset <- data.frame(x=rnorm(100),y=rnorm(100)*2)
y变量确实存在,所以我不理解此错误。
编辑:
我重新启动了r会话,以上代码正常工作。但是,如果我在真实数据集上使用它,仍然会遇到问题:
lmfunction(dataset,y,x,1:100)
Error in eval(predvars, data, env) : object 'y' not found
答案 0 :(得分:2)
与您可能构建的大多数其他函数不同,您没有传递对象:您试图构建公式,因此会出错。
lmFunc <- function(data, formula){
formula <- as.formula(formula)
lm <- lm(formula, data)
coef(lm)
}
lmFunc(mtcars, qsec ~ mpg)
答案 1 :(得分:0)
如果您希望函数的结构保持为4个输入且不带引号,则可以执行以下操作:
library(dplyr)
lmfunction <- function(data, y, x, index){
data %>%
select(my_y = !!enquo(y), my_x = !!enquo(x)) %>%
lm(my_y~my_x, data = ., subset = index) %>%
coefficients()
}
lmfunction(iris, Sepal.Length, Petal.Length, 1:150)
#> (Intercept) my_x
#> 4.3066034 0.4089223
lmfunction(mtcars, qsec ,mpg, 1:32)
#> (Intercept) my_x
#> 15.3547689 0.1241366
我们要做的是将所需的变量包装在enquo
中,以避免出现“找不到对象'**'”错误。然后,我们同时选择变量并将其重命名。我重命名的原因是我发现很难在lm
中加入定量。然后,我们使用新命名的变量运行lm
。