ifelse
位于 base
包(package)。 说明
ifelse
返回一个与 test
形状相同的值,该值填充有从 yes
或 no
中选择的元素,具体取决于 test
的元素是 TRUE
还是 FALSE
。
用法
ifelse(test, yes, no)
参数
test |
可以强制为逻辑模式的对象。 |
yes |
返回 |
no |
返回 |
细节
如果yes
或no
太短,它们的元素将被回收。当且仅当 test
的任何元素为 true 时才会评估 yes
,对于 no
也类似。
test
中的缺失值给出了结果中的缺失值。
值
与 test
具有相同长度和属性(包括维度和 "class"
)的向量,并且数据值来自 yes
或 no
的值。答案的模式将从逻辑上进行强制,以首先适应从 yes
获取的任何值,然后适应从 no
获取的任何值。
警告
结果的模式可能取决于 test
的值(参见示例),结果的类属性(参见 oldClass
)取自 test
。并且可能不适合从 yes
和 no
中选择的值。
有时最好使用诸如
(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 test
和 no
参数)。此函数仅用于向后兼容,只要 yes
和 no
是函数,就应使用 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 invisible 将打印模式更改为不可见
- R icuSetCollate 按 ICU 设置整理
- R identity 恒等函数
- R is.recursive 对象是原子的还是递归的?
- R identical 测试对象是否完全相等
- R is.object 对象是“内部分类的”吗?
- R integer 整数向量
- R isS4 测试 S4 对象
- R iconv 在编码之间转换字符向量
- R interactive R 是否以交互方式运行?
- R is.language 对象是语言对象吗?
- R interaction 计算因子交互作用
- R isSymmetric 测试矩阵或其他对象是否对称(厄米特)
- R is.finite 有限、无限和 NaN 数
- R is.single 对象是单精度类型吗?
- R is.R 我们使用的是 R,而不是 S?
- R is.unsorted 测试对象是否未排序
- R is.function 是类型(原始)函数的对象吗?
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Conditional Element Selection。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。