本次課程簡要介紹一下R
中的邏輯運(yùn)算雀瓢。
R
中有兩個邏輯值,也稱為布爾值酌住。 它們分別是TRUE
和FALSE
店归。 在R
中,可以構(gòu)造邏輯表達(dá)式酪我,其結(jié)果為TRUE
或FALSE
消痛。
相等
創(chuàng)建邏輯表達(dá)式需要邏輯運(yùn)算符,邏輯運(yùn)算符的功能類似于+都哭、-秩伞、*、/
等算術(shù)運(yùn)算符欺矫。我們首先學(xué)習(xí)的邏輯運(yùn)算符是相等運(yùn)算符纱新,用2
個等號表示:==
。簡單嘗試下:
> TRUE == TRUE
[1] TRUE
與算術(shù)運(yùn)算符一樣穆趴,邏輯運(yùn)算符也能使用括號()
來分組脸爱,以改變運(yùn)算順序。
> FALSE == (TRUE == FALSE)
[1] TRUE
等式邏輯運(yùn)算符也可以用來比較數(shù)字未妹。
> 6 == 7
[1] FALSE
結(jié)果是FALSE
簿废,因?yàn)?code>6比7
小空入,他們并不相等。
小于族檬、大于
小于運(yùn)算符<
用來比較左側(cè)的數(shù)字是否小于右側(cè)的數(shù)字歪赢。我們再來用<
比較6
和7
。
> 6 < 7
[1] TRUE
小于運(yùn)算符還可以和等號一起組成運(yùn)算符<=
导梆,表示左側(cè)的數(shù)字小于或等于右側(cè)的數(shù)字。
> 10 <= 10
[1] TRUE
相對應(yīng)的迂烁,也存在大于運(yùn)算符>
和大于等于運(yùn)算符>=
看尼。
不相等
上面提到相等的運(yùn)算符,在R
中還有不相等運(yùn)算符!=
盟步,用來計算兩邊的值是否不相等藏斩。因?yàn)楸磉_(dá)式TRUE != FALSE
的結(jié)果是TRUE
。與相等運(yùn)算符一樣却盘,不相等運(yùn)算也可以用于數(shù)字狰域。
> 5 != 7
[1] TRUE
取反
為了取反布爾表達(dá)式,我們可以用!
(非)操作符黄橘。比如! TRUE
(非真)和 FALSE
是相等的兆览。我們可以嘗試對5 == 7
的結(jié)果取反。
> !(5 == 7)
[1] TRUE
與或
當(dāng)我們需要檢查多個邏輯表達(dá)式之間的關(guān)系時塞关,就要用到與和或運(yùn)算符抬探。
與(AND)
讓我們先看一下與運(yùn)算符的工作方式。 在R
中帆赢,有2
個與運(yùn)算符小压,分別是:&
和&&
。這兩個運(yùn)算符的工作方式相似椰于。即如果運(yùn)算符兩邊的布爾值均為TRUE
怠益,則返回TRUE
。否則瘾婿,返回FALSE
蜻牢。
> FALSE & FALSE
[1] FALSE
我們可以使用&
運(yùn)算符對向量進(jìn)行與運(yùn)算。 與的&&
版本僅比較向量的第一個成員偏陪。 下面通過一個例子看看兩者的區(qū)別孩饼。
> TRUE & c(TRUE, FALSE, FALSE)
[1] TRUE FALSE FALSE
在這里,又一次看到了向量的循環(huán)使用竹挡。上述代碼等價于c(TRUE, TRUE, TRUE) & c(TRUE, FALSE, FALSE)
《迫ⅲ現(xiàn)在我們把&
替換成&&
。
> TRUE && c(TRUE, FALSE, FALSE)
[1] TRUE
在這種情況下揪罕,左邊的TRUE
只和右邊向量的第一個元素TRUE
進(jìn)行了與操作梯码,剩余的元素都被忽略了宝泵。
或(OR)
使用或運(yùn)算符|
比較兩側(cè)的表達(dá)式,如果兩邊都是TRUE
轩娶,同樣返回TRUE
儿奶。但是如果只有一邊為TRUE
,結(jié)果依然返回TRUE
鳄抒。只有當(dāng)兩邊的結(jié)果都是FALSE
時闯捎,結(jié)果才是FALSE
。
對于上面的例子许溅,我們使用|
和||
分別進(jìn)行重新比較瓤鼻。
> TRUE | c(TRUE, FALSE, FALSE)
[1] TRUE TRUE TRUE
> TRUE || c(TRUE, FALSE, FALSE)
[1] TRUE
運(yùn)算順序
在算術(shù)運(yùn)算符中存在運(yùn)算順序,比如乘(*
)的運(yùn)算優(yōu)先級就比加(+
)的高贤重。在邏輯運(yùn)算符中同樣有優(yōu)先級茬祷。首先與運(yùn)算的優(yōu)先級高于或運(yùn)算。我們來看一個可能存在歧義的例子并蝗。
> 5 > 8 || 6 != 8 && 4 > 3.9
[1] TRUE
這個表達(dá)式等價于5 > 8 || (6 != 8 && 4 > 3.9)
祭犯,各表達(dá)式的布爾值是FALSE || (TRUE && TRUE)
。所以結(jié)果是TRUE
滚停。下面還有幾個例子沃粗。
找出下面表達(dá)式中最后結(jié)果為真的:
1: 99.99 > 100 || 45 < 7.3 || 4 != 4.0
2: FALSE || TRUE && FALSE
3: TRUE && FALSE || 9 >= 4 && 3 < 6
4: TRUE && 62 < 62 && 44 >= 44
找出下面表達(dá)式中最后結(jié)果為假的:
1: FALSE || TRUE && 6 != 4 || 9 > 4
2: FALSE && 6 >= 6 || 7 >= 8 || 50 <= 49.5
3: 6 >= -9 && !(6 > 7) && !(!TRUE)
4: !(8 > 4) || 5 == 5.0 && 7.8 >= 7.79
相關(guān)函數(shù)
現(xiàn)在我們對R
中的邏輯表達(dá)式有一點(diǎn)了解了,我們可以使用R
中提供的一些函數(shù)來處理邏輯表達(dá)式键畴。
isTRUE()
比如isTRUE()
函數(shù)陪每,它接受一個參數(shù),如果參數(shù)的計算結(jié)果為真镰吵,則返回TRUE
,反之返回FALSE
檩禾。
> isTRUE(6 > 4)
[1] TRUE
identical()
函數(shù)identical()
用來比較兩個R
對象是否一致,一致時返回TRUE
疤祭。
> identical('twins', 'twins')
[1] TRUE
xor()
有一個值得注意的函數(shù)是異或函數(shù)xor()
盼产。這個函數(shù)接受2
個參數(shù),當(dāng)一個參數(shù)為TRUE
勺馆,另一個參數(shù)為FALSE
時戏售,結(jié)果返回TRUE
,其他情況返回FALSE
草穆。
> xor(5 == 6, !FALSE)
[1] TRUE
which()
which()
函數(shù)會返回參數(shù)表達(dá)式中結(jié)果為TRUE
的元素索引灌灾。
> ints <- sample(10)
> ints
[1] 9 3 1 8 10 4 2 5 6 7
> which(ints > 7)
[1] 1 4 5
在ints > 7
的返回結(jié)果中,第1悲柱、4锋喜、5
位元素是TRUE
。所以最終返回1、4嘿般、5
段标。
any()、all()
像which()
函數(shù)一樣炉奴,函數(shù)any()
和all()
都將邏輯向量作為其參數(shù)逼庞。
如果邏輯向量中的一個或多個元素為TRUE
,則any()
函數(shù)將返回TRUE
瞻赶。
如果邏輯向量中的每個元素均為TRUE
赛糟,則all()
函數(shù)將返回TRUE
。
> any (ints < 0)
[1] FALSE
> all(ints > 0)
[1] TRUE
小結(jié)
邏輯運(yùn)算符:
- 相等 ——
==
- 不相等 ——
!==
比較兩側(cè)的表達(dá)式是否相等 - 取反 ——
!
對布爾值取反 - 大于砸逊、大于等于 ——
>
,>=
- 小于璧南、小于等于 ——
<
,<=
- 與 ——
&
,&&
兩側(cè)都為真痹兜,則結(jié)果為真穆咐。否則結(jié)果為假 - 或 ——
|
颤诀,||
兩側(cè)都為假字旭,則結(jié)果為假。有一側(cè)為真崖叫,則結(jié)果為真遗淳。
與運(yùn)算符的優(yōu)先級高于或優(yōu)先級