I'm trying to make multiple conditions:
adae <- adae %>%
mutate(AREPIOD = if_else((AESTDTC >= AP01SDT) & (AESTDTC <= AP01EDT), 1,
if_else((AESTDTC >= AP02SDT) & (AESTDTC <= AP02EDT), 2, "")))
But I get the error:
Caused by error in `if_else()`:
! Can't combine `true` <double> and `false` <character>.
Please help. Where is the problem?
Unlike base R's ifelse, the type of the "true" and "false" arguments in dplyr's if_else must agree. In your case, you are trying to get your inner if_else to return either a number 2, or the empty string "". Since the output of if_else is a vector, it is unclear whether you want a numeric vector or a character vector.
Base R's ifelse will simply convert the numbers to characters here:
ifelse(c(TRUE, TRUE, FALSE), 2, "")
#> [1] "2" "2" ""
But this may not be what you wanted. You can't do any maths on the output, for example, since the "2" values in the above are character strings. if_else forces you to decide what you mean, to avoid such ambiguity:
if_else(c(TRUE, TRUE, FALSE), 2, "")
#> Error in `if_else()`:
#> ! Can't combine `true` <double> and `false` <character>.
#> Run `rlang::last_trace()` to see where the error occurred.
If we really want a character vector, we need to explicitly make the 2 appear as a character string for if_else to work:
if_else(c(TRUE, TRUE, FALSE), "2", "")
#> [1] "2" "2" ""
My guess though is that in your case, you want a numeric vector, with "" representing a missing value. It can be difficult to get away from this if you are used to spreadsheets, but missing numeric values in R must be recorded as NA, otherwise the vector gets converted to the wrong type. So it might be better to have:
if_else(c(TRUE, TRUE, FALSE), 2, NA)
#> [1] 2 2 NA
In your case, therefore, you need to decide whether you want
adae <- adae %>%
mutate(AREPIOD = if_else((AESTDTC >= AP01SDT) & (AESTDTC <= AP01EDT), "1",
if_else((AESTDTC >= AP02SDT) & (AESTDTC <= AP02EDT), "2", "")))
or
adae <- adae %>%
mutate(AREPIOD = if_else((AESTDTC >= AP01SDT) & (AESTDTC <= AP01EDT), 1,
if_else((AESTDTC >= AP02SDT) & (AESTDTC <= AP02EDT), 2, NA)))
Either will work, but the type of output is up to you.