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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。