这些逻辑运算符你都使用正确了吗?

逻辑运算是数学运算的重要组成部分,但其更是计算机计算的底层设置。作为一门数据处理语言,逻辑运算在R中承担着非常非常重要的作用。本专题就专门为大家整理一下R语言中的逻辑运算:TRUE/FALSE.


目录

1 基本逻辑运算符 2 异或(xor) 3 all()和any() 4 实例拆解:如何筛选非零列?

正文

1 基本逻辑运算符


注:这里将数学运算符也整理了一下,权当回顾一下。
类别

  运算符

            描述

数学运算符

  x + y

加法

  x - y

减法

  x * y

乘法

  x / y

除法

  x ^ y或x ^**y

乘幂

  x %% y

模运算

  x %/% y  

整数除法

逻辑运算符

  x == y

判断是否相等【严格等于,区别于赋值“=”

<
判断是否小于

  x <= y

判断是否小于等于

>
判断是否大于

  x >= y

判断是否大于等于

  x & y

向量的逻辑“与”运算(x、y以及运算结果都是向量)                               

  X | y

向量的逻辑“或”运算(x、y以及运算结果都是向量)

  x && y

标量的逻辑“与”运算(返回标量)

  x || y

标量的逻辑“或”运算(返回标量)

  !x 

 逻辑非

补充
xor(x,y)异或:xor(T,F)返回TRUE
all(x)all()是在全部为TURE时返回T,
any(x)
any()是存在任何一个TRUE时返回TRUE


R语言逻辑运算中额外注意2点

(1)逻辑值TRUE和FALSE可以缩写为T和F(两者都必须大写);在算术表达式中,它们会转换为1和0。


(2)在R中,所有非零值在逻辑运算中都会被当作为TRUE

 
 
> TRUE & FALSE  #返回[1] FALSE	
> 0.2 & 0    #返回[1] FALSE

(3)在R语言中标量常被看作含有一个元素的向量,但在逻辑运算中是存在差异。上表中逻辑“与”【&】和逻辑“或” | 】是对向量的逻辑运算(虽然单个标量也适用),但其返回的结果是逻辑向量,是对逻辑运算中的每一组元素进行逻辑运算后返回的结果。

因此,此处引入另外两个不常用但需要了解的逻辑运算符:
  • x&&y标量的逻辑“与”运算,判断逻辑x和y只要包含一个"&"运算的TRUE行即返回TRUE标量

  •   x||y 标量的逻辑“或”运算,判断逻辑向量x和y中包含一个"|"运算TRUE行即可返回TRUE标量


示例1:比较&与&&
 
 
> x <- c(TRUE,FALSE,TRUE,FALSE)	
> y <- c(TRUE,TRUE,FALSE,FALSE)	
> #---比较&与&&---#	
> x&y	
[1]  TRUE FALSE FALSE FALSE	
> 	
> x&&y  #对比第9行结果可以发现,在逻辑向量逻辑运算中只要包含一个"&"运算的TRUE行即返回TRUE	
[1] TRUE	
> x[c(2,3,4)]&&y[c(2,3,4)]	
[1] FALSE	
	
> x[1]&&y[1]  #x[1] TRUE和y[1] TRUE	
[1] TRUE	
> x[2]&&y[2]  #x[2] FALSE和y[2] TRUE	
[1] FALSE	
> x[4]&&y[4]  #x[4] FALSE和y[4] FALSE	
[1] FALSE


示例2:比较"|"与"||"

 
 
> x <- c(TRUE,FALSE,TRUE,FALSE)	
> y <- c(TRUE,TRUE,FALSE,FALSE)	
> 	
> #---比较|与||---#	
> x|y	
[1]  TRUE  TRUE  TRUE FALSE	
> 	
> x||y  #判断逻辑向量x和y中包含一个"|"运算TRUE行即可返回TRUE  	
[1] TRUE	
> 	
> x[1]||y[1]  #x[1] TRUE和y[1] TRUE	
[1] TRUE	
> x[2]||y[2]  #x[2] FALSE和y[2] TRUE	
[1] TRUE	
> x[4]||y[4]  #x[4] FALSE和y[4] FALSE	
[1] FALSE

2 异或(xor)


说明:当对应元素不等时返回TRUE。例如:
  • xor(T,F)返回TRUE

  • xor(T,T)返回FALSE

  • xor(F,F)返回FALSE

 
 
#xor异或:当对应元素不等时返回TRUE	
> x <- c(TRUE,FALSE,TRUE,FALSE)	
> y <- c(TRUE,TRUE,FALSE,FALSE)	
> xor(x,y)	
[1] FALSE  TRUE  TRUE FALSE


3 all()和any()


判断数据中是否存在TRUE值,其中all()是在全部为TURE时返回T,any是在存在任何一个TRUE时返回TRUE 注意事项:

(1)all(all(x), all(y)) == all(x, y)

(2)logical(0)返回TRUE

 
 
> x <- c(TRUE,FALSE,TRUE,FALSE)	
> all(x)  #all中,如果所有均为TRUE,返回TRUE;反之,返回FALSE	
[1] FALSE	
> any(x) #anyl中,如果任一值为TRUE,返回TRUE;反之,返回FALSE	
[1] TRUE	
	
#多变量all或any	
> y <- c(TRUE,TRUE,FALSE,FALSE)	
> all(x,y)	
[1] FALSE	
> all(all(x),all(y)) #all(all(x), all(y)) == all(x, y)	
[1] FALSE	
	
> any(x,y) #x,y中存在任意一个TRUE,即返回TRUE	
[1] TRUE


4 实例拆解:如何筛选非零列?


示例1:apply + !+ all

x[,apply(x,2,function(x) !all(x==0))]

来自于知乎回答者@HopeR

 
 
> df <- matrix(c(a = rep(0,5), b = c(-1:3)),nrow = 2,byrow = TRUE)	
> x <- data.frame(df, stringsAsFactors = FALSE)	
> x	
  X1 X2 X3 X4 X5	
1  0  0  0  0  0	
2 -1  0  1  2  3	
> #来自于知乎回答者@HopeR :x[,apply(x,2,function(x) !all(x==0))]	
#apply(x,2,function(x) !all(x==0)) #对x数据库做列操作,判断每一列中的所有元素是否为0,,然后渠非"!"	
#   X1    X2    X3    X4    X5 	
# TRUE FALSE  TRUE  TRUE  TRUE > 	
> x[,apply(x,2,function(x) !all(x==0))]	
  X1 X3 X4 X5	
1  0  0  0  0	
2 -1  1  2  3


示例2:purrr包(tidyverse)

purrr::discard(df, ~all(.x == 0))

purrr::keep(df, ~any(.x != 0))

来自花儿少年交流群

 
 
> x <- matrix(c(a = rep(0,5), b = c(-1:3)),nrow = 2,byrow = TRUE)	
> df <- data.frame(df, stringsAsFactors = FALSE)	
> library(tidyverse)	
#或library(purrr)	
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --	
√ ggplot2 3.2.0     √ purrr   0.3.2	
√ tibble  2.1.3     √ dplyr   0.8.3	
√ tidyr   0.8.3     √ stringr 1.4.0	
√ readr   1.3.1     √ forcats 0.4.0	
-- Conflicts ------------------------------------------ tidyverse_conflicts() --	
x dplyr::filter() masks stats::filter()	
x dplyr::lag()    masks stats::lag()	
	
> purrr::discard(df, ~all(.x == 0))	
  X1 X3 X4 X5	
1  0  0  0  0	
2 -1  1  2  3	
	
> purrr::keep(df, ~any(.x != 0))	
  X1 X3 X4 X5	
1  0  0  0  0	
2 -1  1  2  3

640?wx_fmt=jpeg

注图片来自于tidyverse网站:https://www.tidyverse.org/



示例3:自建函数 + ifelse

来自拴小林(这个确实自己被搞复杂了smiley_49.png

 
 
#---生成包含全0列数据集————##	
x <- matrix(c(a = rep(0,5), b = c(-1:3)),nrow = 2,byrow = TRUE)	
df <- data.frame(df, stringsAsFactors = FALSE)	
df	
#自定义循环判断全0列,全0列re返回1,非返回0#	
re = rep(NA,dim(df)[2])	
for (i in 1:dim(df)[2]){	
  ifelse(sum(abs(df[,i]))==0,re[i] <- 1,re[i] <- 0)	
}	
	
#which(re ==0)返回非全零0列值#	
df[,which(re == 0)]	
	
#  X1 X3 X4 X5	
#1  0  0  0  0	
#2 -1  1  2  3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值