Description Usage Arguments Details Value Warning References See Also Examples
ifelse returns a value with the same shape as
test which is filled with elements selected
from either yes or no
depending on whether the element of test
is TRUE or FALSE.
1 | ifelse(test, yes, no)
|
test |
an object which can be coerced to logical mode. |
yes |
return values for true elements of |
no |
return values for false elements of |
If yes or no are too short, their elements are recycled.
yes will be evaluated if and only if any element of test
is true, and analogously for no.
Missing values in test give missing values in the result.
A vector of the same length and attributes (including dimensions and
"class") as test and data values from the values of
yes or no. The mode of the answer will be coerced from
logical to accommodate first any values taken from yes and then
any values taken from no.
The mode of the result may depend on the value of test (see the
examples), and the class attribute (see oldClass) of the
result is taken from test and may be inappropriate for the
values selected from yes and no.
Sometimes it is better to use a construction such as
1 |
, possibly extended to handle missing values in test.
Further note that if(test) yes else no is much more efficient
and often much preferable to ifelse(test, yes, no) whenever
test is a simple true/false result, i.e., when
length(test) == 1.
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
if.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | x <- c(6:-4)
sqrt(x) #- gives warning
sqrt(ifelse(x >= 0, x, NA)) # no warning
## Note: the following also gives the warning !
ifelse(x >= 0, sqrt(x), NA)
## ifelse() strips attributes
## This is important when working with Dates and factors
x <- seq(as.Date("2000-02-29"), as.Date("2004-10-04"), by = "1 month")
## has many "yyyy-mm-29", but a few "yyyy-03-01" in the non-leap years
y <- ifelse(as.POSIXlt(x)$mday == 29, x, NA)
head(y) # not what you expected ... ==> need restore the class attribute:
class(y) <- class(x)
y
## ==> Again a case where it is better *not* to use ifelse(), but
## both more efficient and clear:
y2 <- x
y2[as.POSIXlt(x)$mday != 29] <- NA
stopifnot(identical(y2, y))
## example of different return modes:
yes <- 1:3
no <- pi^(0:3)
typeof(ifelse(NA, yes, no)) # logical
typeof(ifelse(TRUE, yes, no)) # integer
typeof(ifelse(FALSE, yes, no)) # double
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.