【问题标题】:How to put NA in a stored list of a For loop when no result没有结果时如何将 NA 放入 For 循环的存储列表中
【发布时间】:2019-05-20 20:14:50
【问题描述】:

我创建了一个 For 循环来对许多变量应用不同的模型:

my_data <- read.xlsx("phyla.xlsx")
start_variables <- 6
variables <- variable.names(my_data)
variables <- variables[-c(1:(start_variables-1))]

#make a list of data frame for each variable
DF.ls <- list()
for (i in start_variables:length(my_data)){
 DF.ls[[i]] <- data.frame(Sample_ID=my_data$Sample_ID,Genotype=my_data$Genotype, 
               Substrate=my_data$Substrate, y=my_data[[i]])
}
DF.ls <- DF.ls[-1]; DF.ls <- DF.ls[-1]; DF.ls <- DF.ls[-1]; DF.ls <- DF.ls[-1]; DF.ls <- DF.ls[-1]

#model1
model1.ls <- list()
for (i in 1:length(DF.ls)){
 model1.ls[[i]] <- gls(y~Substrate+Genotype+Substrate:Genotype, data=DF.ls[[i]])
}
AIC_model1_ls <- list()
for (i in 1:length(model1.ls)){
 AIC_model1_ls[[i]] <- AIC(summary(model1.ls[[i]]))
}
AIC_model1 = unlist(AIC_model1_ls)
AIC_model1 = rbind(AIC_model1)

#model2
model2.ls <- list()
for (i in 1:length(DF.ls)){
 model2.ls[[i]] <- gls(y~Substrate+Genotype+Substrate:Genotype, weights=varIdent(form=~1|Substrate), data=DF.ls[[i]])
}
AIC_model2_ls <- list()
for (i in 1:length(model2.ls)){
AIC_model2_ls[[i]] <- AIC(summary(model2.ls[[i]]))
}
AIC_model2 = unlist(AIC_model2_ls)
AIC_model2 = rbind(AIC_model2)

这可能不是最好的方法,但它工作得很好,除非有一些零处理。

所以我的问题是我有这个错误,当有零时发生:

gls 中的错误(y ~ Substrate + Genotype + Substrate:Genotype, weights = varIdent(form = ~1 | : 错误收敛 (8)

我希望我的 For 循环在发生此错误时将 NA 放入我的列表中,而不是什么都没有。我该怎么做?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    您可以使用try 函数。这将在不停止程序的情况下捕获错误。这是一个示例,因为您没有提供可重现的示例:

    # This model will fail since we have not assigned values to x and y
    model <- try(lm(x ~ y), silent = TRUE)
    
    # However check the output
    model
    
    > model
    [1] "Error in eval(predvars, data, env) : object 'x' not found\n"
    attr(,"class")
    [1] "try-error"
    attr(,"condition")
    <simpleError in eval(predvars, data, env): object 'x' not found>
    
    

    如果你通过了一些有效的尝试,你会看到你会得到正确的结果

    model <- try(lm(wt~ mpg, data = mtcars))
    
    model
    
    > model
    
    Call:
    lm(formula = wt ~ mpg, data = mtcars)
    
    Coefficients:
    (Intercept)          mpg  
         6.0473      -0.1409  
    
    

    因此,考虑到这一点,您可以扩充您的代码以执行以下操作:

    fit <- try(gls(y~Substrate+Genotype+Substrate:Genotype, weights=varIdent(form=~1|Substrate), data=DF.ls[[i]]), silent = TRUE)
    
    if(class(fit)=="try-error"){
      model1.ls[[i]] <- NA
    } else {
      model1.ls[[i]] <- fit
    }
    

    【讨论】:

    • 感谢它为我的模型列表工作!但是现在我有另一个问题......当我尝试列出这些模型摘要中包含的 AIC 时,它会停在上一个列表中的 NA 处。如何将 NA 放在该列表中而不是应用命令? > AIC_model2_ls for (i in 1:length(model2.ls)){ AIC_model2_ls[[i]]
    • 也将这些函数包装在try 中。或者另一个选项是if(is.na(model[I]){next(I)} ,这样如果它看到 NA 它会跳过其余步骤并转到 i 的下一个值
    • 实际上我希望它在遇到 NA 时将另一个 NA 放入该新列表中。我写了这个:AIC_model2_ls[i] &lt;- ifelse(is.na(model2.ls[[i]]), NA, AIC(summary(model2.ls[[i]])))
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多