在 R 中按 list() 变量名而不是索引重命名



我正在使用for循环对项目列表()运行回归,我想用该变量的名称而不是其索引替换对给定列表输入的引用。例如:

frame <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10) ) 
x.list <- list(frame$x1,frame$x2,frame$x3)  
fit <- list()
for(i in 1:length(x.list)){ fit[[i]] <- summary(lm(frame$y ~ x.list[[i]]))}         
fit

我希望每个合适的项目都引用"x1"、"x2"、"x3"而不是"x.list[[i]]"。感谢您对此的任何想法。

不要定义x.list,只需迭代名称:

fit <- vector("list",3)
for ( i in c("x1","x2","x3") ) fit[[i]] <- summary(lm(frame$y ~ frame[[i]]))

改为保存lm您可能想要的不仅仅是摘要,因此只需保存lm

xs     <- c("x1","x2","x3")
xs     <- setNames(xs,xs)
fit_lm <- lapply(xs,function(i)lm(frame$y ~ frame[[i]]))

你可以用lapply(fit_lm,summary)summary,也可以看系数,用

sapply(fit_lm,`[[`,"coefficients")
#                    x1         x2          x3
# (Intercept) 0.1417501  0.2974165  0.25085281
# frame[[i]]  0.2318912 -0.1468433 -0.08783857

如果需要返回值,最好是lapply

xs <- names(frame)[-1]
setNames(
lapply(xs, function(x, dat) {
f <- as.formula(paste("y", x, sep = "~"))
summary(lm(f, data = dat))
}, dat = frame), 
xs)

但是,相同的策略适用于for循环。

最新更新