嗨,我在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)
})
返回"可变长度不同(针对'(strige)')
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)
})
只需使用parse即可将 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)
})
或在eval
内使用as.name
功能,如下所示:
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)
})