运算符
算术、逻辑、比较运算
基础篇向量是R语言中最基础的数据结构,自然地我们会很关注向量的运算,事实上,R语言的强大优势就体现在向量运算上。当然,这都归功于R语言强大的向量化操作。 在此之前,先介绍常用的有以下几种运算符类型:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 其他运算符
算术运算符
+两个向量相加
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a + b
-两个向量相减
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a - b
*两个向量相乘
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a * b
/将第一个向量与第二个向量相除
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a / b
%%两个向量求余
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a %% b
%/%两个向量相除求商
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a %/% b
%*%两个向量的内积,也称为点乘
对于向量
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a %*% b
此运算符也用于将矩阵相乘
R
m <- matrix(c(1:4), ncol = 2)
m %*% m
^将第二向量作为第一向量的指数
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a ^ b
循环补齐(recycling)
做算术运算时,当两个向量长度相等的时候,就一一对应的完成计算;当两个向量长度不相等的时候,短的向量会循环补齐,保持与长向量的长度一致后,再做运算。
- 长向量的长度正好是短向量的整数倍
R
x <- 1
y <- c(10, 20, 30, 40)
x + y
R
x <- c(1, 2)
y <- c(10, 20, 30, 40)
x * y
- 长向量的长度不是短向量的整数倍
R
x <- c(1, 2, 3)
y <- c(10, 20, 30, 40, 50, 60, 70)
x + y
R
x <- c(1, 2, 3)
y <- c(10, 20, 30, 40, 50, 60, 70)
x * y
长度不是整数倍关系的时候,R语言会提出友好的警告,这个警告是非常有必要的,一方面提醒写代码的人是不是写漏了一些数据,另一方面提醒会给看代码的人产生迷惑。因此,为了代码的可读性,除非某一个向量长度为1,我们尽可能避免长度不一致的向量之间的运算。
关系运算符
将第一向量的每个元素与第二向量的相应元素进行比较,比较的结果是布尔值,布尔值是“真” TRUE 或“假” FALSE 中的一个。
>检查第一向量的每个元素是否大于第二向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a > b
<检查第一个向量的每个元素是否小于第二个向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a < b
==检查第一个向量的每个元素是否等于第二个向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a == b
<=检查第一向量的每个元素是否小于或等于第二向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a <= b
>=检查第一向量的每个元素是否大于或等于第二向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a >= b
!=检查第一个向量的每个元素是否不等于第二个向量的相应元素。
R
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a != b
逻辑运算符
逻辑运算符,一般适用于逻辑类型的向量。
&元素逻辑AND运算符。 它将第一向量的每个元素与第二向量的相应元素组合,并且如果两个元素都为TRUE,则给出输出TRUE。
R
a <- c(TRUE, FALSE, FALSE)
b <- c(FALSE, TRUE, FALSE)
a & b
|元素逻辑或运算符。 它将第一向量的每个元素与第二向量的相应元素组合,并且如果元素有一个为真,则给出输出TRUE。
R
a <- c(TRUE, FALSE, FALSE)
b <- c(FALSE, TRUE, FALSE)
a | b
!它被称为逻辑非运算符。 对于向量的每个元素,给出相反的逻辑值。
R
a <- c(TRUE, FALSE, FALSE)
!a
其他运算符
:冒号运算符。它按顺序创建一个整数序列。
R
a <- 1:10
a
typeof(a)
我们在相关章节向量部分,提到seq()函数,也能产生序列
R
b <- seq(from = 1, to = 10, by = 1)
b
typeof(b)
注意到a是整数类型,而b是双精度的数值型。
%in%此运算符用于判断元素是否属于向量。
R
c(2, 3, 7) %in% c(1, 2, 3, 4, 5)
is.na()判断是否为缺失值,R 里缺失值用NA表示,NA的意思就是 not available 或者 not applicable.
R
is.na(c(1, 2, NA, 4, NA, 6))
R
x <- c(1, 2, NA, 4, NA, 6)
!is.na(x)
特殊值
R 语言里还有一些特殊的值: Inf, NaN, NA 和 NULL.
Inf,是Infinity的简写,表示无穷大;-Inf表示无穷小,比如我们用1除以0:
R
1/0
NaN,是Not a Number的简写,表示这个数字没有数学定义,比如
R
0/0
NA,是Not available的简写,表示缺失状态。在后面章节中,当我们处理数据框或者向量的时候回经常遇到它。
NULL,是No value的意思,表示没有值,或者空值的意思,表示变量实际上没有任何值,或者甚至不存在。
R
# NULL: an *entire* vector is absent
c( )
R
# NA: an *element* in a vector is absent
c(1, NA, 3)
---
习题
- 自己填入向量,并运算
{MD}
___ + ___
___ - ___
___ / ___
___ * ___
___ ^ ___
___ == ___
___ != ___
___ < ___
___ > ___
___ <= ___
___ >= ___
___ & ___
___ | ___
___ %in% ___
is.na(___ )
- 说出向量 a 和 b 的差异在什么地方?
R
a <- 1:10
b <- seq(from = 1, to = 10, by = 1)
identical(a, b)