I have a numeric vector:
a <- 1:4
# [1] 1 2 3 4
Check if values in 'a' is larger than 2:
a > 2
# [1] FALSE FALSE TRUE TRUE
However, instead of FALSE
and TRUE
, I want my result to be expressed as 0
and 1
. Currently I am using the following method.
b <- (a > 2)
b[b == TRUE] <- 1
b[b == FALSE] <- 0
Are there any simpler methods?
There are a few ways you can go about this.
Using ifelse
b <- ifelse(a > 2, 1, 0)
This is just a simpler way of writing exactly what you've written in the question: if the condition returns TRUE
, set the value to 1, otherwise set it to 0.
Using as.numeric
b <- as.numeric(a > 2)
Logical values can be converted to their numeric equivalents easily using this function. As one might expect, TRUE
is set to 1 and FALSE
to 0.
The lazy version of as.numeric
b <- 1*(a > 2)
When R sees the multiplication of logical values by a numeric value, it automatically coerces the logicals to their numeric equivalents. Thus logical values can be converted lazily (from a programmer's standpoint) by multiplying by 1.