【问题标题】:Iteration over String in R迭代R中的字符串
【发布时间】:2022-11-11 21:41:41
【问题描述】:

我将回归的(模型)结果存储在类似的东西中

regr_1
regr_2

现在我想通过厨师距离删除异常值

cooksd_1 <- cooks.distance(regr_1)
cooksd_2 <- cooks.distance(regr_2)
influential_1 <- as.numeric(names(cooksd_1)[(cooksd_1 > 3*mean(cooksd_1, na.rm=T))])
influential_2 <- as.numeric(names(cooksd_2)[(cooksd_2 > 3*mean(cooksd_2, na.rm=T))])
 
cleaned_regr1 <- data[-c(influential_1),]
cleaned_regr2 <- data[-c(influential_2),]

喜欢

for (i in 1:5){
  cooksd_i <- cooks.distance(regr_i)

 influential_i <- as.numeric(names(cooksd_i)[(cooksd_1 > 3*mean(cooksd_i, na.rm=T))])
 
 cleaned_regr_i <- data[-c(influential_i),]
 }

所以循环变量名称 regr_ 中的某种索引号

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    如果您可以提供一个可重现的示例,则更容易确保此方法有效,但大致上我建议您首先将模型存储到一个列表中,然后使用lapply()purrr::map() 进行迭代:

    regr_l <- list(regr_1 = regr_1, regr_2 = regr_2)
    
    fit_l <- regr_l |>
             purrr::set_names() |>
             purrr::map(function(x, mydata = mydata) {
                                   cooksd <- cooks.distance(x) 
                                   influential <- as.numeric(names(cooksd)[(cooksd > 3*mean(cooksd, na.rm=T))])
      
                                   mydata[-influential,]
    })
    
    purrr::walk2(fit_l, names(fit_l), function(x, y) { readr::write_csv(x, paste0(y, ".csv") })
    

    请注意,我在这里暗示您的数据对象使用名称“mydata”而不是“data”,以避免与data() 函数发生冲突。

    【讨论】:

    • 谢谢你!但我怎样才能不仅存储最后一个?因为当我想创建像 write.csv2(mydata,....) 这样的输出时,我只能从 regr_2 获得结果
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 2014-04-21
    • 2019-07-15
    • 1970-01-01
    • 2012-10-23
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多