当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R ifelse 条件元素选择


R语言 ifelse 位于 base 包(package)。

说明

ifelse 返回一个与 test 形状相同的值,该值填充有从 yesno 中选择的元素,具体取决于 test 的元素是 TRUE 还是 FALSE

用法

ifelse(test, yes, no)

参数

test

可以强制为逻辑模式的对象。

yes

返回 test 的 true 元素的值。

no

返回 test 的 false 元素的值。

细节

如果yesno太短,它们的元素将被回收。当且仅当 test 的任何元素为 true 时才会评估 yes ,对于 no 也类似。

test 中的缺失值给出了结果中的缺失值。

test 具有相同长度和属性(包括维度和 "class" )的向量,并且数据值来自 yesno 的值。答案的模式将从逻辑上进行强制,以首先适应从 yes 获取的任何值,然后适应从 no 获取的任何值。

警告

结果的模式可能取决于 test 的值(参见示例),结果的类属性(参见 oldClass )取自 test 。并且可能不适合从 yesno 中选择的值。

有时最好使用诸如

  (tmp <- yes; tmp[!test] <- no[!test]; tmp)

,可能扩展为处理 test 中的缺失值。

进一步注意,每当 test 是一个简单的真/假结果时,即当 length(test) == 1 时,if(test) yes else no 效率更高,并且通常比 ifelse(test, yes, no) 更可取。

函数的 srcref 属性经过特殊处理:如果 test 是一个简单的 true 结果,并且 yes 计算结果为具有 srcref 属性的函数,则 ifelse 返回 yes 包括其属性(这同样适用于false testno 参数)。此函数仅用于向后兼容,只要 yesno 是函数,就应使用 if(test) yes else no 形式。

例子

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
## This is a (not atypical) case where it is better *not* to use ifelse(),
## but rather the more efficient and still clear:
y2 <- x
y2[as.POSIXlt(x)$mday != 29] <- NA
## which gives the same as ifelse()+class() hack:
stopifnot(identical(y2, y))


## example of different return modes (and 'test' alone determining length):
yes <- 1:3
no  <- pi^(1:4)
utils::str( ifelse(NA,    yes, no) ) # logical, length 1
utils::str( ifelse(TRUE,  yes, no) ) # integer, length 1
utils::str( ifelse(FALSE, yes, no) ) # double,  length 1

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

if

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Conditional Element Selection。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。