【问题标题】:Why is this condition not logical?为什么这个条件不合逻辑?
【发布时间】:2020-08-01 23:40:07
【问题描述】:

这里是第一个问题,所以请在表格上放纵一下。 如果我只保留整数,我想知道一个充满小数的向量的长度,包括在整数已经存在时擦除它们。 我创建了一个 if 函数,如果它们符合条件,则将某些行保留在“要保留的行”向量中,这是一个布尔值。 不幸的是,在 if 函数所在的 for 循环中经过一段时间后,条件为 NA,因此此消息返回: 如果需要 true/false 的地方缺少值,则会出错。 任何想法为什么? 感谢您的帮助,如果需要,请给我建议以使最终的问题更清楚

epidemies_time <-c(1:epidemies_nb)
time_code <- for (epid_idx in 1:epidemies_nb)
{
  time_trunc<-trunc(time)
row_to_keep<-rep(FALSE,taille)
row_to_keep[1] <- TRUE
dayafterday <- for (time_idx in 2:taille) {
if  (time_trunc[time_idx] != time_trunc[time_idx-1]) {`
  row_to_keep[time_idx-1] <- TRUE
  if (time_idx > 2) {
    time_trunc[time_idx-1] <- time_trunc[time_idx-1] + 1
  }
  time_trunc <- time_trunc[row_to_keep]
  duree<- length(time_trunc)
  epidemies_time[epid_idx]<-duree
} } }

PS: 我跳过了该问题中脚本的所有无用部分,但是如果您需要它或者如果您对如何获得“时间”向量感到好奇,整个代码也在这里,但我确信它有效

suscept<-rep(0,taille)
infect<-rep(0,taille)
remov<-rep(0,taille)
time<-rep(0,taille)
nvcas<-rep(0,taille)
pop_susc <- 0.1
infect[1]<-5
suscept[1]<- pop_susc*taille - infect[1]
remov[1]<- taille - infect[1]+suscept[1]
beta<-0.0000524  
alpha<-0.4
epidemies_nb <- 60
epidemies_time <-c(1:epidemies_nb)
time_code <- for (epid_idx in 1:epidemies_nb) 
{
  modele_epid <- for(ind_idx in 1:(taille-1))
  {
    if(infect[ind_idx]!=0)
    {
      s<--log(runif(1))/(beta*suscept[ind_idx]*infect[ind_idx]+alpha*infect[ind_idx])
      time[ind_idx+1]<-time[ind_idx]+s
      rand<-runif(1)
      proba<-beta*suscept[ind_idx]*infect[ind_idx]/(beta*suscept[ind_idx]*infect[ind_idx]+alpha*infect[ind_idx])
      if (rand<=proba)
      {
        suscept[ind_idx+1]<-suscept[ind_idx]-1
        infect[ind_idx+1]<-infect[ind_idx]+1
        remov[ind_idx+1]<-remov[ind_idx]
        nvcas[ind_idx+1]<-1
      }
      if (rand>proba)
      {
        suscept[ind_idx+1]<-suscept[ind_idx]
        infect[ind_idx+1]<-infect[ind_idx]-1
        remov[ind_idx+1]<-remov[ind_idx]+1
        nvcas[ind_idx+1]<-0
      }
    }
  }

  time_trunc<-trunc(time)
  row_to_keep<-rep(FALSE,taille)
  row_to_keep[1] <- TRUE
  dayafterday <- for (time_idx in 2:taille) {
    if  (time_trunc[time_idx] != time_trunc[time_idx-1]) {
      row_to_keep[time_idx-1] <- TRUE
      if (time_idx > 2) {
        time_trunc[time_idx-1] <- time_trunc[time_idx-1] + 1
      }
      time_trunc <- time_trunc[row_to_keep]
      duree<- length(time_trunc)
      epidemies_time[epid_idx]<-duree
    }
  }
}
epidemies_time```


【问题讨论】:

    标签: r for-loop if-statement na


    【解决方案1】:

    到那时,我在其他地方找到了帮助:

    dayafterday <- for (time_idx in 2:taille) {
        if  (time_trunc[time_idx] != time_trunc[time_idx-1]) {
          row_to_keep[time_idx-1] <- TRUE
          if (time_idx > 2) {
            time_trunc[time_idx-1] <- time_trunc[time_idx-1] + 1
          }
          # time_trunc <- time_trunc[row_to_keep] 
          # Here lies the error
          # this would do it better : time_selec <-  time_trunc[row_to_keep] 
          duree<- length(time_selec)
          epidemies_time[epid_idx]<-duree
        }
      }
    }
    

    然后它可以工作:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多