4-7 逻辑向量(Logical Vector)
4-7-1 基本应用
在先前介绍的函数运算中,笔者偶尔穿插使用了TRUE和FALSE,这个值在R语言中被称为逻辑值(Logical Vaule),这一节将对此作一个完整的说明。有些函数在使用时会返回TRUE或FALSE,例如,3-4节所介绍的is.finite()、is.infinite()。基本原则是,如果函数执行结果是真,则返回TRUE,如果是假,则返回FALSE。这两个值对于程序流程的控制很重要,未来章节会作详细的说明。
本节主要介绍含逻辑值的向量对象,当一个函数内的参数含有逻辑向量对象时,整个R语言的设计将显得可更灵活。R语言可以用比较两个值的方式返回逻辑值,如下表所示。
对于上述比较的表达式而言,x和y也可以是一个向量对象。
实例ch4_63:下列实例是如果Jordon在比赛中的进球数高于10球则输出TRUE,否则输出FALSE。
which()函数所使用的参数是一个比较表达式,可以列出符合条件的索引值,相当于可以找出向量对象中的哪些元素是符合条件。
实例ch4_64:下列实例是列出Jordon进球数超过10球的场次。
which.max():可列出最大值的第1个索引值。
which.min():可列出最小值的第1个索引值。
一个向量对象的最大值可能会出现好几次,分别对应不同的索引,which.max()函数则只列出第1个出现的最大值所对应索引值。which.min()意义相同,除了是列出最小值所对应的索引值。
实例ch4_65:下列实例是列出进球数最多和最少的场次。
实例ch4_66:下列实例是将Jordon和Lin作比较,同时列出Jordon进球数较多的场次。
在上述实例中,可以发现Jordon和Lin有两场比赛进球数相同,如果修改,列出Jordon与Lin进球数相同或Jordon进球数较多的场次,则可以参考下列实例。
实例ch4_67:列出Jordon与Lin进球数相同或Jordon进球数较多的场次。
当然我们也可以继续延伸使用best.baskets向量对象。
实例ch4_68:下列实例是使用best.baskets向量对象列出Jordon在得分较多或与Lin相同的比赛中的实际进球数,同时也列出Lin的进球数。
4-7-2 对Inf、-Inf和缺失值NA的处理
使用逻辑表达式进行筛选满足一定条件的值时,若是碰上NA,会如何呢。请看下列实例。
实例ch4_69:NA在逻辑表达式中的应用。
从上述实例看,好像是NA大于5,所以NA也返回。
非也。
任何比较,对于NA而言均是返回NA,可参考下列实例。
实例ch4_70:NA在逻辑表达式中的另一个应用。
接下来考虑的是Inf和-Inf,可参考下列的实例。
实例ch4_71:Inf在逻辑表达式中的应用。
由上述实例可知,Inf的确大于5所以上述也返回Inf。可以用下列实例验证这个结果。
实例ch4_72:Inf在逻辑表达式中的另一个应用。
很明显,当比较Inf是否大于5时,是返回TRUE的。接下来,下列是用-Inf测试的实例。
实例ch4_73:-Inf在逻辑表达式中的应用。
很明显,-Inf是小于5的,所以返回FALSE。
4-7-3 多组逻辑表达式的应用
再度使用Jordon的进球数,下列实例可得到Jordon的最高进球数和最低进球数。
实例ch4_74:得到Jordon的最高进球数和最低进球数。
有了以上数据,可用下列方法求得某区间的数据。
实例ch4_75:下列是列出不是最高进球数和最低进球数的场次和进球数。
由上述运算可知,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()函数的应用。
若与本章4-7-2节的实例作比较,则可以看到NA被剔除了。
4-7-5 逻辑值TRUE和FALSE的运算
R语言和其他高级语言一样(例如C语言),可以将TRUE视为1,将FALSE视为0使用。下列实例可列出,Jordon共有几场进球数比Lin多或一样多。
实例ch4_77:列出Jordon共有几场进球数比Lin多或一样多。
any()函数的用法是,只要参数向量对象有1个元素是TRUE,则返回TRUE。
实例ch4_78:any()函数的应用。
在上述实例中,笔者将better.baskets调整为Jordon的进球数须大于Lin的进球数,才传回TRUE。由于仍有3场Jordon的进球数是大于Lin的,所以any()函数返回TRUE。
另外一个常用函数是all(),用法是,所有参数必须均是TRUE,才返回TRUE。
实例ch4_79:all()函数的应用。
在上述实例,笔者将better.baskets调整为Jordon的进球数须大于或等于Lin的进球数,才返回TRUE。虽然有5场Jordon的进球数是大于Lin,但仍有1场Jordon的进球数小于Lin,因此all()函数返回FALSE。