我是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"
但这似乎也不起作用。请帮忙!
答案 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"
}
}