У меня есть фрейм данных с таким же префиксом, я хочу вывести все результаты lm. Вот имитируйте фрейм данных и скрипты.

test<-data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
dd <- subset(test, X10 != 0)

for(i in i:length(nrow(dd)-1)){
  x<- dd$X10
  y<- dd[, grep("X",names(dd[ ,-1]))]
  lm_name<- paste("lm", "_", i, sep="")
  lm_name<- lm(y[[i]]~x) 
  }

Надеюсь, кто-то может помочь. Спасибо!

r
1
LEE 2 Сен 2020 в 19:11

2 ответа

Лучший ответ

Вероятно, вам следует просто присвоить результаты каждой итерации цикла чему-то.

res.for <- c()
for(i in 1:(ncol(dd) - 1)) {
  x <- dd$X10
  y <- dd[, grep("X", names(dd[, -1]))]
  lm_name <- paste0("lm_", i)
  res.for[[i]] <- lm(y[[i]] ~ x)
  names(res.for)[i] <- lm_name
}

res.for[1:3]
# $lm_1
# 
# Call:
# lm(formula = y[[i]] ~ x)
# 
# Coefficients:
#   (Intercept)            x  
#        0.4864           NA  
# 
# 
# $lm_2
# 
# Call:
# lm(formula = y[[i]] ~ x)
# 
# Coefficients:
#   (Intercept)            x  
#        0.5136           NA  
# 
# 
# $lm_3
# 
# Call:
# lm(formula = y[[i]] ~ x)
# 
# Coefficients:
#   (Intercept)            x  
#           0.5           NA  

Однако вы могли бы сделать это намного проще, используя lapply и reformulate.

res <- setNames(lapply(names(dd)[-10], function(y) lm(reformulate("X10", y), dd)),
                paste0("lm_", seq_len(ncol(dd) - 1)))
res[1:3]
# $lm_1
# 
# Call:
# lm(formula = reformulate("X10", y), data = dd)
# 
# Coefficients:
#   (Intercept)          X10  
#        0.4864           NA  
# 
# 
# $lm_2
# 
# Call:
# lm(formula = reformulate("X10", y), data = dd)
# 
# Coefficients:
#   (Intercept)          X10  
#        0.5136           NA  
# 
# 
# $lm_3
# 
# Call:
# lm(formula = reformulate("X10", y), data = dd)
# 
# Coefficients:
#   (Intercept)          X10  
#           0.5           NA 
coef1 <- function(x) coef(x)[1]
stopifnot(all.equal(sapply(res, coef1), sapply(res.for, coef1)))
0
jay.sf 2 Сен 2020 в 17:51

Magic_for - очень хороший пакет, хорошо подходящий для этого. обратите внимание, что ваш цикл не работает, согласно комментарию @ dcarlson, поэтому я заменил 1:length(nrow(plotname)-1) на 1:length(nrow(test)-1) в демонстрационных целях. EDIT изменен на 1:length(nrow(dd)-1) согласно OP

library(magicfor)

test<-data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
dd <- subset(test, X10 != 0)

magic_for(print, silent=T, progress=T)

for(i in 1:length(nrow(dd)-1)){ # edited to match changes in OP's post
  x<- dd$X10
  y<- dd[, grep("X",names(dd[ ,-1]))]
  lm_name<- paste("lm", "_", i, sep="")
  lm_name<- lm(y[[i]]~x) 
  print(lm_name)
}

result<-magic_result_as_vector()
result

Вы также можете получить доступ к результатам как magic_result() или magic_result_as_data_frame() в зависимости от конкретных потребностей

0
D.J 3 Сен 2020 в 08:42