R语言-逻辑运算

本次课程简要介绍一下R中的逻辑运算。

R中有两个逻辑值,也称为布尔值。 它们分别是TRUEFALSE。 在R中,可以构造逻辑表达式,其结果为TRUEFALSE

相等

创建逻辑表达式需要逻辑运算符,逻辑运算符的功能类似于+、-、*、/等算术运算符。我们首先学习的逻辑运算符是相等运算符,用2个等号表示:==。简单尝试下:

> TRUE == TRUE
[1] TRUE

与算术运算符一样,逻辑运算符也能使用括号()来分组,以改变运算顺序。

> FALSE == (TRUE == FALSE)
[1] TRUE

等式逻辑运算符也可以用来比较数字。

> 6 == 7
[1] FALSE

结果是FALSE,因为67小,他们并不相等。

小于、大于

小于运算符< 用来比较左侧的数字是否小于右侧的数字。我们再来用<比较67

> 6 < 7
[1] TRUE

小于运算符还可以和等号一起组成运算符<=,表示左侧的数字小于或等于右侧的数字。

> 10 <= 10
[1] TRUE

相对应的,也存在大于运算符>和大于等于运算符>=

不相等

上面提到相等的运算符,在R中还有不相等运算符!=,用来计算两边的值是否不相等。因为表达式TRUE != FALSE的结果是TRUE。与相等运算符一样,不相等运算也可以用于数字。

> 5 != 7
[1] TRUE

取反

为了取反布尔表达式,我们可以用!(非)操作符。比如! TRUE (非真)和 FALSE是相等的。我们可以尝试对5 == 7的结果取反。

> !(5 == 7)
[1] TRUE

与或

当我们需要检查多个逻辑表达式之间的关系时,就要用到运算符。

与(AND)

让我们先看一下运算符的工作方式。 在R中,有2运算符,分别是:&&&。这两个运算符的工作方式相似。即如果运算符两边的布尔值均为TRUE,则返回TRUE。否则,返回FALSE

> FALSE & FALSE
[1] FALSE

我们可以使用&运算符对向量进行运算。 &&版本仅比较向量的第一个成员。 下面通过一个例子看看两者的区别。

> TRUE & c(TRUE, FALSE, FALSE)
[1]  TRUE FALSE FALSE

在这里,又一次看到了向量的循环使用。上述代码等价于c(TRUE, TRUE, TRUE) & c(TRUE, FALSE, FALSE)。现在我们把&替换成&&

> TRUE && c(TRUE, FALSE, FALSE)
[1] TRUE

在这种情况下,左边的TRUE只和右边向量的第一个元素TRUE进行了操作,剩余的元素都被忽略了。

或(OR)

使用运算符|比较两侧的表达式,如果两边都是TRUE,同样返回TRUE。但是如果只有一边为TRUE,结果依然返回TRUE。只有当两边的结果都是FALSE时,结果才是FALSE

对于上面的例子,我们使用|||分别进行重新比较。

> TRUE | c(TRUE, FALSE, FALSE)
[1] TRUE TRUE TRUE

> TRUE || c(TRUE, FALSE, FALSE)
[1] TRUE

运算顺序

在算术运算符中存在运算顺序,比如乘(*)的运算优先级就比加(+)的高。在逻辑运算符中同样有优先级。首先与运算的优先级高于或运算。我们来看一个可能存在歧义的例子。

> 5 > 8 || 6 != 8 && 4 > 3.9
[1] TRUE

这个表达式等价于5 > 8 || (6 != 8 && 4 > 3.9),各表达式的布尔值是FALSE || (TRUE && TRUE)。所以结果是TRUE。下面还有几个例子。

找出下面表达式中最后结果为的:

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

找出下面表达式中最后结果为的:

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

相关函数

现在我们对R中的逻辑表达式有一点了解了,我们可以使用R中提供的一些函数来处理逻辑表达式。

isTRUE()

比如isTRUE()函数,它接受一个参数,如果参数的计算结果为真,则返回TRUE,反之返回FALSE

> isTRUE(6 > 4)
[1] TRUE

identical()

函数identical()用来比较两个R对象是否一致,一致时返回TRUE

> identical('twins', 'twins')
[1] TRUE

xor()

有一个值得注意的函数是异或函数xor()。这个函数接受2个参数,当一个参数为TRUE,另一个参数为FALSE时,结果返回TRUE,其他情况返回FALSE

> xor(5 == 6, !FALSE)
[1] TRUE

which()

which()函数会返回参数表达式中结果为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的返回结果中,第1、4、5位元素是TRUE。所以最终返回1、4、5

any()、all()

which()函数一样,函数any()all()都将逻辑向量作为其参数。
如果逻辑向量中的一个或多个元素为TRUE,则any()函数将返回TRUE
如果逻辑向量中的每个元素均为TRUE,则all()函数将返回TRUE

> any (ints < 0)
[1] FALSE

> all(ints > 0)
[1] TRUE

小结

逻辑运算符:

  • 相等 —— ==
  • 不相等 —— !== 比较两侧的表达式是否相等
  • 取反 —— ! 对布尔值取反
  • 大于、大于等于 —— >,>=
  • 小于、小于等于 —— <,<=
  • 与 —— &&& 两侧都为真,则结果为真。否则结果为假
  • 或 —— ||| 两侧都为假,则结果为假。有一侧为真,则结果为真。

运算符的优先级优先级

R语言学习7-逻辑运算

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容