逻辑运算是数学运算的重要组成部分,但其更是计算机计算的底层设置。作为一门数据处理语言,逻辑运算在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。
代码语言:javascript复制> TRUE & FALSE #返回[1] FALSE
> 0.2 & 0 #返回[1] FALSE
(3)在R语言中标量常被看作含有一个元素的向量,但在逻辑运算中是存在差异。上表中逻辑“与”【&】和逻辑“或”【 | 】是对向量的逻辑运算(虽然单个标量也适用),但其返回的结果是逻辑向量,是对逻辑运算中的每一组元素进行逻辑运算后返回的结果。
因此,此处引入另外两个不常用但需要了解的逻辑运算符:
- x&&y:标量的逻辑“与”运算,判断逻辑x和y中只要包含一个"&"运算的TRUE行即返回TRUE标量
- x||y :标量的逻辑“或”运算,判断逻辑向量x和y中包含一个"|"运算TRUE行即可返回TRUE标量
示例1:比较&与&&
代码语言:javascript复制> 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:比较"|"与"||"
代码语言:javascript复制> 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
代码语言:javascript复制> 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
代码语言:javascript复制> 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))
来自花儿少年交流群
代码语言:javascript复制> 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
注图片来自于tidyverse网站:https://www.tidyverse.org/
示例3:自建函数 ifelse
来自拴小林(这个确实自己被搞复杂了)
代码语言:javascript复制#---生成包含全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