![R语言:迈向大数据之路](https://wfqqreader-1252317822.image.myqcloud.com/cover/909/27110909/b_27110909.jpg)
4-7 逻辑向量(Logical Vector)
4-7-1 基本应用
在先前介绍的函数运算中,笔者偶尔穿插使用了TRUE和FALSE,这个值在R语言中被称为逻辑值(Logical Vaule),这一节将对此作一个完整的说明。有些函数在使用时会返回TRUE或FALSE,例如,3-4节所介绍的is.finite()、is.infinite()。基本原则是,如果函数执行结果是真,则返回TRUE,如果是假,则返回FALSE。这两个值对于程序流程的控制很重要,未来章节会作详细的说明。
本节主要介绍含逻辑值的向量对象,当一个函数内的参数含有逻辑向量对象时,整个R语言的设计将显得可更灵活。R语言可以用比较两个值的方式返回逻辑值,如下表所示。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img01437.jpg?sign=1739526749-vnis9tmYjBM81XA0pKkDLrf2MSVRUyeU-0-8dbe809332769e107675ba2de1de4492)
对于上述比较的表达式而言,x和y也可以是一个向量对象。
实例ch4_63:下列实例是如果Jordon在比赛中的进球数高于10球则输出TRUE,否则输出FALSE。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00177.jpg?sign=1739526749-xDEAPsFw73rB4LpwdNQDTDSoB8BbQTW3-0-f06411812ca880c757a147484b767946)
which()函数所使用的参数是一个比较表达式,可以列出符合条件的索引值,相当于可以找出向量对象中的哪些元素是符合条件。
实例ch4_64:下列实例是列出Jordon进球数超过10球的场次。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00178.jpg?sign=1739526749-noyhEDhFOeDNYoobAag1xkhjYMZqgsmZ-0-9a98064068294763619ed0a8b930f37f)
which.max():可列出最大值的第1个索引值。
which.min():可列出最小值的第1个索引值。
一个向量对象的最大值可能会出现好几次,分别对应不同的索引,which.max()函数则只列出第1个出现的最大值所对应索引值。which.min()意义相同,除了是列出最小值所对应的索引值。
实例ch4_65:下列实例是列出进球数最多和最少的场次。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00179.jpg?sign=1739526749-SNOdU9peqPOh1DTtQmWIUCijGF3RaCPa-0-15484d377ffcba31af51a7cf90a9ab61)
实例ch4_66:下列实例是将Jordon和Lin作比较,同时列出Jordon进球数较多的场次。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00180.jpg?sign=1739526749-sQvEc0LwW1jajdEJMiY9LgE8T0D1R4ZL-0-45fe99fa3bde43c06b2f8f73370c89f6)
在上述实例中,可以发现Jordon和Lin有两场比赛进球数相同,如果修改,列出Jordon与Lin进球数相同或Jordon进球数较多的场次,则可以参考下列实例。
实例ch4_67:列出Jordon与Lin进球数相同或Jordon进球数较多的场次。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00181.jpg?sign=1739526749-32noTMd5zRbTgUk30Q3CPKNnqaxfWCRC-0-4bc7fdf309349e5d2e4cabd8fc3e1d84)
当然我们也可以继续延伸使用best.baskets向量对象。
实例ch4_68:下列实例是使用best.baskets向量对象列出Jordon在得分较多或与Lin相同的比赛中的实际进球数,同时也列出Lin的进球数。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00182.jpg?sign=1739526749-ap3UrJ3gCPUGdXJpJu7jilo6lbhEDltx-0-719943ff55067b414f99cdfe7d43a0a8)
4-7-2 对Inf、-Inf和缺失值NA的处理
使用逻辑表达式进行筛选满足一定条件的值时,若是碰上NA,会如何呢。请看下列实例。
实例ch4_69:NA在逻辑表达式中的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00183.jpg?sign=1739526749-TKrIB2hysmSUD8R6isKBd2EEwcLXEtCj-0-66bc5f883e06fa793a43f3e69ca820eb)
从上述实例看,好像是NA大于5,所以NA也返回。
非也。
任何比较,对于NA而言均是返回NA,可参考下列实例。
实例ch4_70:NA在逻辑表达式中的另一个应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00184.jpg?sign=1739526749-MelzadqknCiBsggKbzRatpT5NyQCCaFl-0-592546eddf857b07f36c3576d0704c59)
接下来考虑的是Inf和-Inf,可参考下列的实例。
实例ch4_71:Inf在逻辑表达式中的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00185.jpg?sign=1739526749-G1tQSuzi4sRRAfSyH6ASkTM71aD2p9HN-0-6dbad23518544e115523c0515b6deb3b)
由上述实例可知,Inf的确大于5所以上述也返回Inf。可以用下列实例验证这个结果。
实例ch4_72:Inf在逻辑表达式中的另一个应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00186.jpg?sign=1739526749-tBqF1yPASS6MyIIDXTQcDuN39uTfjCVG-0-e80d9d71cc962ef59b3943b5d01db6b3)
很明显,当比较Inf是否大于5时,是返回TRUE的。接下来,下列是用-Inf测试的实例。
实例ch4_73:-Inf在逻辑表达式中的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00187.jpg?sign=1739526749-ZDgFeevoAmTpNUUvBx6qBDP1Kv3FnP5W-0-a3cc34041404720a298ecaddd40bd0cc)
很明显,-Inf是小于5的,所以返回FALSE。
4-7-3 多组逻辑表达式的应用
再度使用Jordon的进球数,下列实例可得到Jordon的最高进球数和最低进球数。
实例ch4_74:得到Jordon的最高进球数和最低进球数。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00188.jpg?sign=1739526749-SRc3PDUATLj9W6OapddK8149Y6Y0LAj8-0-9fc3fdf720c3e6faffbed15aefb28433)
有了以上数据,可用下列方法求得某区间的数据。
实例ch4_75:下列是列出不是最高进球数和最低进球数的场次和进球数。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00189.jpg?sign=1739526749-hmc4kdhTJKguzKYiFgQSjmM1N1G2s0dP-0-1a90218f7e355e8c81119989c35f48c9)
由上述运算可知,lower.baskets是得到非最高进球数的场次[1, 2, 3, 5, 6],upper.baskets是得到非最低进球数的场次[1, 2, 3, 4, 6],接着我们用逻辑运算符号“&”,可以得到非最高进球数与最低进球数的场次是[1, 2, 3, 6]。
4-7-4 NOT表达式
由4-7-2节的实例可知,若向量对象中含缺失值NA,会造成我们使用时的错乱,当碰上这类状况时,可先用is.na()函数判断向量对象中是否含有NA,然后再用“!is.na()”,即可剔除NA,可参考下列实例。
实例ch4_76:NOT表达式和is.na()函数的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00190.jpg?sign=1739526749-0AYeIKIC5uBIlQPEx25UzHBrxpudBdoR-0-1ff9c3e36baa2ecc6bac8678b544903e)
若与本章4-7-2节的实例作比较,则可以看到NA被剔除了。
4-7-5 逻辑值TRUE和FALSE的运算
R语言和其他高级语言一样(例如C语言),可以将TRUE视为1,将FALSE视为0使用。下列实例可列出,Jordon共有几场进球数比Lin多或一样多。
实例ch4_77:列出Jordon共有几场进球数比Lin多或一样多。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00191.jpg?sign=1739526749-7ueQhrNu2dsSCrScI9wqOXfM01E6tmFu-0-48e6618706e9c33617e089d68f7769ff)
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00192.jpg?sign=1739526749-dRu0vEhemeYJyzIT1tjuUGr0eTdGEt4d-0-8844d10b5586212e6f66a95a59403933)
any()函数的用法是,只要参数向量对象有1个元素是TRUE,则返回TRUE。
实例ch4_78:any()函数的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00193.jpg?sign=1739526749-8eoAP5SwxrA32HTqdTQP5RiGwy6KGbt9-0-bf1d3dc23b415c18966c28cebdee7b4f)
在上述实例中,笔者将better.baskets调整为Jordon的进球数须大于Lin的进球数,才传回TRUE。由于仍有3场Jordon的进球数是大于Lin的,所以any()函数返回TRUE。
另外一个常用函数是all(),用法是,所有参数必须均是TRUE,才返回TRUE。
实例ch4_79:all()函数的应用。
![](https://epubservercos.yuewen.com/6CA2AF/15477644904546506/epubprivate/OEBPS/Images/Img00194.jpg?sign=1739526749-p5V3ktSQcu16F9Aj9lSkP4eLl1CSnZil-0-ad2e6988fb437aa64e7138df90724607)
在上述实例,笔者将better.baskets调整为Jordon的进球数须大于或等于Lin的进球数,才返回TRUE。虽然有5场Jordon的进球数是大于Lin,但仍有1场Jordon的进球数小于Lin,因此all()函数返回FALSE。