来自多个if / else if语句的多个操作 - R

时间:2016-06-02 14:52:53

标签: r if-statement

我是R的新手,我遇到了在数据框中正确填充数据列的问题。我正在使用一系列if / else if语句基于另一列(P_Value)填充两列(P_Score和P_Class)。

i<- 0
nr<- nrow(myData)
while(i<nr){
  i<-1+i
  if(toString(myData$P_Value[i])=="NA"){ myData$P_Score[i] <- myData$P_Value[i]
  } else if (as.numeric(toString(myData$P_Value[i]))<5){
      myData$P_Score[i] <- 1; myData$P_Class[i] <- "Minimal Depression";
  } else if (as.numeric(toString(myData$P_Value[i]))<10){
      myData$P_Score[i] <- 2; myData$P_Class[i] <- "Mild Depression";
  } else if (as.numeric(toString(myData$P_Value[i]))<15){
      myData$P_Score[i] <- 3; myData$P_Class[i] <- "Moderate Depression";
  } else if (as.numeric(toString(myData$P_Value[i]))<20){
      myData$P_Score[i] <- 4; myData$P_Class[i] <- "Moderate-Severe Depression";
  } else 
      myData$P_Score[i] <- 5; myData$P_Class[i] <- "Severe Depression";
}

然而,这并没有给我我想要的结果,相反,我结束了这个:

P_Value  P_Score    P_Class
4        1          Severe Depression
25       5          Severe Depression
8        2          Severe Depression
13       3          Severe Depression
17       4          Severe Depression
1        1          Severe Depression
12       3          Severe Depression

所以P_Score填充得很好,但是P_Class总是默认为“严重抑郁症”。我必须遇到一些基于1条件执行多个语句的问题,但是我无法弄清楚我做错了什么。我在其他地方读过,只要你在声明都应该有效后加上分号,但这显然不起作用。

我也尝试过这样的命令:

} else if (as.numeric(toString(myData$P_Value[i]))<5){
  myData$P_Score[i] <- 1
  myData$P_Class[i] <- "Minimal Depression"

但这似乎也不起作用。请帮忙!

3 个答案:

答案 0 :(得分:2)

您应该使用:

if (<condition>){
} else {
    if(<condition>){
    } else {
    }
}

或者:

ifelse(<condition>,
    ifelse(<condition>, <yes>, <no>)
)

所以,在我看来,你在{}命令之后错过了else

答案 1 :(得分:2)

R具有此功能,不需要任何循环。请阅读?cut

设置示例

myData
#   P_Value
# 1       4
# 2      25
# 3       8
# 4      13
# 5      17
# 6       1
# 7      12
# 8      NA

grps <- cut(myData$P_Value, 
          breaks=c(-Inf, 5, 10, 15, 20, Inf), 
          labels=c("Min Dep", "Mild Dep", "Mod Dep", "Mod-Sev Dep", "Sev Dep"))

创建组后,我们可以从中创建一个Score和Class列

myData$P_Score <- as.numeric(grps)
myData$P_Class <- grps
myData
#   P_Value P_Score     P_Class
# 1       4       1     Min Dep
# 2      25       5     Sev Dep
# 3       8       2    Mild Dep
# 4      13       3     Mod Dep
# 5      17       4 Mod-Sev Dep
# 6       1       1     Min Dep
# 7      12       3     Mod Dep
# 8      NA      NA        <NA>

答案 2 :(得分:0)

您的代码存在问题,它始终为R提供了命令myData$P_Class[i] <- "Severe Depression";。作为示例,请查看此代码:

test <- 12
ret <- NA
if(test < 5){
  ret <- 1; print("Minimal");
}else if(test < 10){
  ret <- 2; print ("Mild");
}else if(test < 15){
  ret <- 3; print ("Moderate");
}else if(test < 20){
  ret <- 4; print ("Moderate-Severe");
}else ret<- 5;print("Severe Depression");

您应该为最后一行else{myData$P_Score[i] <- 5; myData$P_Class[i] <- "Severe Depression";}而写。有疑问,总是使用更多的括号而不是更少。这是我更简化的代码(我打赌,它甚至变得更聪明)。

for(i in 1:nrow(myData)){
  tmp <- as.numeric(toString(myData$P_Value[i]))
  if(is.na(myData$P_Value[i])){
    myData$P_Score[i] <- myData$P_Value[i]
  } else if (tmp < 5){
    myData$P_Score[i] <- 1
    myData$P_Class[i] <- "Minimal Depression"
  } else if (tmp < 10){
    myData$P_Score[i] <- 2 
    myData$P_Class[i] <- "Mild Depression"
  } else if (tmp < 15){
    myData$P_Score[i] <- 3
    myData$P_Class[i] <- "Moderate Depression"
  } else if (tmp < 20){
    myData$P_Score[i] <- 4
    myData$P_Class[i] <- "Moderate-Severe Depression"
  } else{
    myData$P_Score[i] <- 5
  myData$P_Class[i] <- "Severe Depression"
  }
}