【问题标题】:Issue with R if else loop: Conditions only partly executedR if else 循环问题:条件仅部分执行
【发布时间】:2023-01-10 01:41:11
【问题描述】:

我有以下数据框:

Row    Repro Number2
1      1     EWC
2     NA     LWY
3      7     EWS
4     NA     LWC
5     NA     EWC
6     NA     LWC
7      3     EWY
8     NA    LW2Y
9     NA Unknown
10    NA     LWC
11     1     EWC
12    NA     LWY
13    NA     EWY
14    NA     LWY
15    NA Unknown
16    NA     LWC

在此数据框上,我使用以下循环:

for (i in 1:nrow(df3)) {
  if(df3$Number2[i+1]=="Unknown" & is.na(df3$Repro[i])) {
    df3$Number2[i]="Unknown"
  } else{
    df3$Number2[i]==df3$Number2[i]
  }
}

当循环确实运行时,我在最后收到一个错误代码,并且数据框最终看起来不像我想要的结果。

我的问题是,虽然代码正在执行其预期目的(如果 number2 列中的值也是“未知”并且关联的 Repro 值为 NA,则将 number2 列中的值替换为“未知”),它只是用“最初在数据帧中的未知”值。我希望它也考虑到添加的新“Unknowns”并执行循环条件。

这是错误代码:

Error in if (df3$Number2[i + 1] == "Unknown" & is.na(df3$Repro[i])) { : 
  missing value where TRUE/FALSE needed

这是运行循环后的数据框。我添加了另一个名为“Number2.Correct”的列,显示了我希望 Number2 列的实际外观。问题出在第 12 行和第 13 行 - 这些应该分别是“Unknowns”而不是“LWY”和“EWY”。

   Repro Number2  Number2.Correct
1      1     EWC  EWC
2     NA     LWY  LWY
3      7     EWS  EWS
4     NA     LWC  LWC
5     NA     EWC  EWC
6     NA     LWC  LWC
7      3     EWY  EWY
8     NA Unknown  Unknown
9     NA Unknown  Unknown
10    NA     LWC  LWC
11     1     EWC  EWC
12    NA     LWY  Unknown
13    NA     EWY  Unknown 
14    NA Unknown  Unknown
15    NA Unknown  Unknown
16    NA     LWC  LEW

最后,我有两个问题:

  1. 如何更改我的代码以获得我想要的结果?
  2. 为什么会出现错误代码,它是否对问题负部分责任?

【问题讨论】:

    标签: r loops if-statement


    【解决方案1】:

    i+1 在数据的 nrow 之后超出范围。我们可能需要

    for (i in 1:(nrow(df3)-1)) {
      if(df3$Number2[i+1]=="Unknown" & is.na(df3$Repro[i])) {
        df3$Number2[i]="Unknown"
      } else{
        df3$Number2[i]==df3$Number2[i]
      }
    }
    

    【讨论】:

      【解决方案2】:

      代码失败的原因是nrow(df3)+1 超出范围。所以for循环需要是1:(nrow(df3)-1)

      要迭代更新 Number2,一种简单的方法(虽然不优雅)是使用 while 循环。停止条件是新旧Number2相同。

      while(T){
        df3$Number2_new <- df3$Number2
        for (i in 1:(nrow(df3)-1)) {
          if(df3$Number2_new[i+1]=="Unknown" & is.na(df3$Repro[i])) {
            df3$Number2_new[i]="Unknown"
          } else{
            df3$Number2_new[i]==df3$Number2_new[i]
          }
        }
        
        if(all(df3$Number2==df3$Number2_new)){
          df3 <- df3%>%
            mutate(Number2=Number2_new)%>%
            select(-Number2_new)
          break
        }else{
          df3 <- df3%>%
            mutate(Number2=Number2_new)%>%
            select(-Number2_new)
        }
      }
      
      
      df3
      
         Row Repro Number2
      1    1     1     EWC
      2    2    NA     LWY
      3    3     7     EWS
      4    4    NA     LWC
      5    5    NA     EWC
      6    6    NA     LWC
      7    7     3     EWY
      8    8    NA Unknown
      9    9    NA Unknown
      10  10    NA     LWC
      11  11     1     EWC
      12  12    NA Unknown
      13  13    NA Unknown
      14  14    NA Unknown
      15  15    NA Unknown
      16  16    NA     LWC
      

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 2019-05-16
        相关资源
        最近更新 更多