2015-07-14 3 views
0

Надежда кто-то может помочь с этой проблемой в R.Повторяя IfElse заявления по строке в dataframe или используя IfElse-заявление на векторе с многодисковыми факторами

Я имею набор данных (Df), что в немного упрощена внешнем виде как этот

Resp Status Threshold 
    1  16  3 
    0  134  4 
    1  3.5  3 

Я хотел бы выполнить эту IfElse-тест на каждой из строк

CR.Wat = ifelse(Threshold != "NA" && Status != "NA", 
       ifelse(Resp != 1, Threshold/Status, Status/Threshold), 
       "") 

я ожидаю получить три значения Threshold/Status. Но вместо этого я получаю только одно значение.

Предполагаю, что я должен как-то сказать, что мне это понравится для каждой из строк.

Я пытался сделать это с помощью этой формулы

CR.Wat = ifelse(c(Threshold) != "NA" && c(Status) != "NA", 
       ifelse(c(Resp) != 1, c(Threshold/Status), c(Status/Threshold)), 
       "") 

Но это ничего не влияет.

+0

Используйте только один '&' т.е. 'с (ДФ, IfElse (Treshold! = "NA" & Status! = "NA", IfElse (Респ! = 1, Treshold/Статус, Статус/Treshold), "")) 'Также, BTW, для проверки NA это' is.na (Status) '. Я предполагаю, что у вас есть «характер» NAs – akrun

ответ

1

Ваша операция вернула только одно значение, потому что вы использовали && вместо &. Вы можете прочитать о различии между этими двумя операторами по адресу ?"&".

Это, как говорится, ваша операция может быть выполнена без использования вложенного IfElse, заметив, что вы хотите Threshold/Status (ака (Threshold/Status)^1) при Респе! = 1 и состояние/Threshold (ака (Threshold/Status)^(-1)) при Респе == 1 .

with(dat, (Treshold/Status)^(1-2*(Resp == 1))) 
# [1] 5.33333333 0.02985075 1.16666667 
+0

Большое спасибо! Это сработало отлично! У вас есть ссылка на сайт, где я могу прочитать о «с» -thing? Причина, хотя она работает, я не знаю, как это работает – EmilieK

+0

У вас также есть решение этой проблемы? http://stackoverflow.com/questions/31401206/split-dataframe-when-value-in-first-column-is-not-na – EmilieK

+0

@EmilieK В основном это означает, что вам не нужно набирать 'dat $ var 'для доступа к переменной' var' из фрейма данных 'dat'. Вы могли бы уже написать выражение как '(dat $ Treshold/dat $ Status)^(1-2 * (dat $ Resp == 1))'. – josliber