2016-06-02 2 views
1

Я новичок в R и испытываю проблему, правильно заполняющую столбец данных в кадре данных. Я заполняю два столбца (P_Score и P_Class) на основе другого столбца (P_Value), используя ряд операторов if/else if.Несколько действий из нескольких операторов if/else if - R

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 if, но я не могу понять, что я делаю неправильно. Я читал в другом месте, пока вы положили точки с запятой после того, как заявления должны работать, но это явно не работает.

Я также попытался интервал из команд, как это:

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

Но это, кажется, не работает. Пожалуйста помоги!

+0

Первый намек: использование 'для (я в 1: nr) {'более« естественный », чем' while (i Qaswed

+1

Или вместо цикла используйте что-то вроде '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»)) ' –

+1

Ответ @J_F получает смысл, поскольку у вас есть два утверждения после else, вам нужно поместить их в блок. – Psidom

ответ

1

Вы должны использовать:

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

Или:

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

Так, по-моему, вы пропустили {} после команды else.

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" 
    } 
} 
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")) 

С созданных групп, мы можем сделать результат и колонки класса от него

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> 
Смежные вопросы