嗨,我无法通过lapply获取lm来循环浏览不同的DV,我已经在data.frame中预先确定了相应的权重列。
这是一个有效的例子:
require(dplyr)
df <- mtcars %>% mutate_at(
vars(mpg:drat),
funs(wt=rnorm(n()))
)
dvs <- names(select(df,mpg:drat))
res <- list()
res <- lapply(dvs, function(x) {
formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
lm(formula,df)
})
但这会返回“找不到对象'mpg_wt'”
res <- lapply(dvs, function(x) {
formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
weightvars <- paste0(x,"_wt")
lm(formula,weights=as.formula(weightvars),df)
})
并返回“变量长度不同(找到'(权重)')”
res <- lapply(dvs, function(x) {
formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
weightvars <- paste0(x,"_wt")
lm(formula,weights=eval(weightvars),df)
})
只需使用解析并传递weightvars
作为text
的值。
我希望这有帮助:
res <- lapply(dvs, function(x) {
formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
weightvars <- paste0(x,"_wt")
lm(formula,weights=eval(parse(text=weightvars)),df)
})
或者在as.name
中使用eval
函数,如下所示:
res <- lapply(dvs, function(x) {
formula <- as.formula(paste0(x," ~ wt + qsec + as.factor(vs)"))
weightvars <- paste0(x,"_wt")
lm(formula,weights=eval(as.name(weightvars)),data=df)
})