2016-08-17 2 views
1

Я пытаюсь создать вычисляемое поле в R, используя оператор if, который сравнивает строки, которые в Excel легко, но я не могу понять это в R. Формула в Excel выглядит следующим образом:Оператор R if, сравнивающий строки

=IF(AND(E2<>"Accepted", B2=B3,E3="Accepted"), -(F2-F3),"") 

Где Столбец B представляет собой список из 9-значных чисел (т.е., 200100111) и колонке F содержит даты. Код, который я написал в R выглядит следующим образом:

if(df_srt$NUMBER==shift(df_srt$NUMBER, 1L, type="lead") && df_srt$DESCRIPTION != "Accepted" && shift(VA_df_srt$DESCRIPTION, 1L, type="lead")=="Accepted") {1} else {0}

Я тогда понял, что если оператор сравнивает только длину вектора 1 так, чтобы не работать. Я могу сравнивать строки по отдельности, чтобы получить «TRUE» значение следующим образом:

TEST2calc <- df_srt$NUMBER==shift(df_srt$NUMBER, 1L, type="lead") 

Но я хочу, чтобы эти три сравнения, а затем присвоить значение, если все они правдивы.

Благодаря

+0

Нет необходимости в скобки вокруг цифр в вашем 'if'. –

ответ

1

Как вы отметили, if сравнивает только одно значение. Для вексеризованной версии вам необходимо использовать ifelse, и вам также необходимо будет переключиться на версии с векторизованными версиями для && и ||, которые равны & и | соответственно.

Следовательно:

ifelse(df_srt$NUMBER == shift(df_srt$NUMBER, 1L, type = "lead") & 
     df_srt$DESCRIPTION != "Accepted" & 
     shift(VA_df_srt$DESCRIPTION, 1L, type = "lead") == "Accepted", 1, 0) 

В качестве альтернативы, вы можете использовать тот факт, что логические значения могут быть преобразованы в числа 1 и 0 с помощью as.numeric:

as.numeric(df_srt$NUMBER == shift(df_srt$NUMBER, 1L, type = "lead") & 
      df_srt$DESCRIPTION != "Accepted" & 
      shift(VA_df_srt$DESCRIPTION, 1L, type = "lead") == "Accepted") 
Смежные вопросы