R 基础运算
本章介绍 R 语言的简单运算。
赋值
一般语言的赋值是 = 号,但是 R 语言是数学语言,所以赋值符号与我们数学书上的伪代码很相似,是一个左箭头 <- :
实例
a <- 123
b <- 456
print(a + b)
a <- 123
b <- 456
print(a + b)
以上代码执行结果:
[1] 579
这个赋值符号是 R 语言的一个形式上的优点和操作上的缺点:形式上更适合数学工作者,毕竟不是所有的数学工作者都习惯于使用 = 作为赋值符号。
操作上来讲,< 符号和 - 符号都不是很好打的字符,这会让很多程序员不适应。因此,R 语言的比较新的版本也支持 = 作为赋值符:
a = 123
b = 456
print(a + b)
这也是合法的 R 程序。
注意:很难考证从 R 的哪个版本开始支持了 = 赋值,但是本教程习用的 R 版本是 4.0.0。
数学运算符
下表列出了主要的数学运算符以及他们的运算顺序:
优先级 | 符号 | 含义 |
---|---|---|
1 | () | 括号 |
2 | ^ | 乘方运算 |
3 | %% | 整除求余 |
%/% | 整除 | |
4 | * | 乘法 |
/ | 除法 | |
5 | + | 加法 |
- | 减法 |
以下实例演示了简单的数学运算:
实例
> 1 + 2 * 3
[1] 7
> (1 + 2) * 3
[1] 9
> 3 / 4
[1] 0.75
> 3.4 - 1.2
[1] 2.2
> 1 - 4 * 0.5^3
[1] 0.5
> 8 / 3 %% 2
[1] 8
> 8 / 4 %% 2
[1] Inf
> 3 %% 2^2
[1] 3
> 10 / 3 %/% 2
[1] 10
关系运算符
> 1 + 2 * 3
[1] 7
> (1 + 2) * 3
[1] 9
> 3 / 4
[1] 0.75
> 3.4 - 1.2
[1] 2.2
> 1 - 4 * 0.5^3
[1] 0.5
> 8 / 3 %% 2
[1] 8
> 8 / 4 %% 2
[1] Inf
> 3 %% 2^2
[1] 3
> 10 / 3 %/% 2
[1] 10
下表列出了 R 语言支持的关系运算符,关系运算符比较两个向量,将第一向量与第二向量的每个元素进行比较,结果返回一个布尔值。
运算符 | 描述 |
---|---|
> | 判断第一个向量的每个元素是否大于第二个向量的相对应元素。 |
< | 判断第一个向量的每个元素是否小于第二个向量的相对应元素。 |
== | 判断第一个向量的每个元素是否等于第二个向量的相对应元素。 |
!= | 判断第一个向量的每个元素是否不等于第二个向量的相对应元素。 |
>= | 判断第一个向量的每个元素是否大于等于第二个向量的相对应元素。 |
<= | 判断第一个向量的每个元素是否小于等于第二个向量的相对应元素。 |
实例
v <- c(2,4,6,9)
t <- c(1,4,7,9)
print(v>t)
print(v < t)
print(v == t)
print(v!=t)
print(v>=t)
print(v<=t)
v <- c(2,4,6,9)
t <- c(1,4,7,9)
print(v>t)
print(v < t)
print(v == t)
print(v!=t)
print(v>=t)
print(v<=t)
执行以上代码输出结果为:
[1] TRUE FALSE FALSE FALSE
[1] FALSE FALSE TRUE FALSE
[1] FALSE TRUE FALSE TRUE
[1] TRUE FALSE TRUE FALSE
[1] TRUE TRUE FALSE TRUE
[1] FALSE TRUE TRUE TRUE
逻辑运算符
下表列出了 R 语言支持的逻辑运算符,可用于数字、逻辑和复数类型的向量。
大于 1 的数字都为 TRUE。
逻辑运算符比较两个向量,将第一向量与第二向量的每个元素进行比较,结果返回一个布尔值。
运算符 | 描述 |
---|---|
& | 元素逻辑与运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素都为 TRUE,则结果为 TRUE,否则为 FALSE。 |
| | 元素逻辑或运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素中有一个为 TRUE,则结果为 TRUE,如果都为 FALSE,则返回 FALSE。 |
! | 逻辑非运算符,返回向量每个元素相反的逻辑值,如果元素为 TRUE 则返回 FALSE,如果元素为 FALSE 则返回 TRUE。 |
&& | 逻辑与运算符,只对两个向量对第一个元素进行判断,如果两个元素都为 TRUE,则结果为 TRUE,否则为 FALSE。 |
|| | 逻辑或运算符,只对两个向量对第一个元素进行判断,如果两个元素中有一个为 TRUE,则结果为 TRUE,如果都为 FALSE,则返回 FALSE。 |
实例
v <- c(3,1,TRUE,2+3i)
t <- c(4,1,FALSE,2+3i)
print(v&t)
print(v|t)
print(!v)
# &&、||只对第一个元素进行比较
v <- c(3,0,TRUE,2+2i)
t <- c(1,3,TRUE,2+3i)
print(v&&t)
v <- c(0,0,TRUE,2+2i)
t <- c(0,3,TRUE,2+3i)
print(v||t)
v <- c(3,1,TRUE,2+3i)
t <- c(4,1,FALSE,2+3i)
print(v&t)
print(v|t)
print(!v)
# &&、||只对第一个元素进行比较
v <- c(3,0,TRUE,2+2i)
t <- c(1,3,TRUE,2+3i)
print(v&&t)
v <- c(0,0,TRUE,2+2i)
t <- c(0,3,TRUE,2+3i)
print(v||t)
执行以上代码输出结果为:
[1] TRUE TRUE FALSE TRUE
[1] TRUE TRUE TRUE TRUE
[1] FALSE FALSE FALSE FALSE
[1] TRUE
[1] FALSE
赋值运算符
R 语言变量可以使用向左,向右或等于操作符来赋值。
下表列出了 R 语言支持的赋值运算符。
运算符 | 描述 |
---|---|
<− = <<− | 向左赋值。 |
−> −>> | 向右赋值。 |
实例
# 向左赋值
v1 <- c(3,1,TRUE,"zhishitu")
v2 <<- c(3,1,TRUE,"zhishitu")
v3 = c(3,1,TRUE,"zhishitu")
print(v1)
print(v2)
print(v3)
# 向右赋值
c(3,1,TRUE,"zhishitu") -> v1
c(3,1,TRUE,"zhishitu") ->> v2
print(v1)
print(v2)
# 向左赋值
v1 <- c(3,1,TRUE,"zhishitu")
v2 <<- c(3,1,TRUE,"zhishitu")
v3 = c(3,1,TRUE,"zhishitu")
print(v1)
print(v2)
print(v3)
# 向右赋值
c(3,1,TRUE,"zhishitu") -> v1
c(3,1,TRUE,"zhishitu") ->> v2
print(v1)
print(v2)
执行以上代码输出结果为:
[1] "3" "1" "TRUE" "zhishitu"
[1] "3" "1" "TRUE" "zhishitu"
[1] "3" "1" "TRUE" "zhishitu"
[1] "3" "1" "TRUE" "zhishitu"
[1] "3" "1" "TRUE" "zhishitu"
其他运算符
R 语言还包含了一些特别的运算符。
运算符 | 描述 |
---|---|
: | 冒号运算符,用于创建一系列数字的向量。 |
%in% | 用于判断元素是否在向量里,返回布尔值,有的话返回 TRUE,没有返回 FALSE。 |
%*% | 用于矩阵与它转置的矩阵相乘。 |
实例
# 1 到 10 的向量
v <- 1:10
print(v)
# 判断数字是否在向量 v 中
v1 <- 3
v2 <- 15
print(v1 %in% v)
print(v2 %in% v)
# 矩阵与它转置的矩阵相乘
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
t = M %*% t(M)
print(t)
# 1 到 10 的向量
v <- 1:10
print(v)
# 判断数字是否在向量 v 中
v1 <- 3
v2 <- 15
print(v1 %in% v)
print(v2 %in% v)
# 矩阵与它转置的矩阵相乘
M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE)
t = M %*% t(M)
print(t)
执行以上代码输出结果为:
[1] 1 2 3 4 5 6 7 8 9 10
[1] TRUE
[1] FALSE
[,1] [,2]
[1,] 65 82
[2,] 82 117
数学函数
常见对一些数学函数有:
函数 | 说明 |
---|---|
sqrt(n) | n的平方根 |
exp(n) | 自然常数e的n次方, |
log(m,n) | m的对数函数,返回n的几次方等于m |
log10(m) | 相当于log(m,10) |
以下实例演示了数学函数的应用:
实例
> sqrt(4)
[1] 2
> exp(1)
[1] 2.718282
> exp(2)
[1] 7.389056
> log(2,4)
[1] 0.5
> log10(10000)
[1] 4
> sqrt(4)
[1] 2
> exp(1)
[1] 2.718282
> exp(2)
[1] 7.389056
> log(2,4)
[1] 0.5
> log10(10000)
[1] 4
取整函数:
名称 | 参数模型 | 含义 |
---|---|---|
round | (n) | 对 n 四舍五入取整 |
(n, m) | 对 n 保留 m 位小数四舍五入 | |
ceiling | (n) | 对 n 向上取整 |
floor | (n) | 对 n 向下取整 |
以下实例演示了取整函数的应用:
实例
> round(1.5)
[1] 2
> round(2.5)
[1] 2
> round(3.5)
[1] 4
> round(4.5)
[1] 4
> round(1.5)
[1] 2
> round(2.5)
[1] 2
> round(3.5)
[1] 4
> round(4.5)
[1] 4
注意:R 中的 round 函数有些情况下可能会"舍掉五"。
当取整位是偶数的时候,五也会被舍去,这一点与 C 语言有所不同。
R 的三角函数是弧度制:
实例
> sin(pi/6)
[1] 0.5
> cos(pi/4)
[1] 0.7071068
> tan(pi/3)
[1] 1.732051
> sin(pi/6)
[1] 0.5
> cos(pi/4)
[1] 0.7071068
> tan(pi/3)
[1] 1.732051
反三角函数:
实例
> asin(0.5)
[1] 0.5235988
> acos(0.7071068)
[1] 0.7853981
> atan(1.732051)
[1] 1.047198
> asin(0.5)
[1] 0.5235988
> acos(0.7071068)
[1] 0.7853981
> atan(1.732051)
[1] 1.047198
如果学习过概率论和统计学,应该对以下的概率分布函数比较了解,因为 R 语言为数学工作者设计,所以经常会用到:
实例
> dnorm(0)
[1] 0.3989423
> pnorm(0)
[1] 0.5
> qnorm(0.95)
[1] 1.644854
> rnorm(3, 5, 2) # 产生 3 个平均值为 5,标准差为 2 的正态随机数
[1] 4.177589 6.413927 4.206032
> dnorm(0)
[1] 0.3989423
> pnorm(0)
[1] 0.5
> qnorm(0.95)
[1] 1.644854
> rnorm(3, 5, 2) # 产生 3 个平均值为 5,标准差为 2 的正态随机数
[1] 4.177589 6.413927 4.206032
这四个都是用来计算正态分布的函数。它们的名字都以 norm 结尾,代表"正态分布"。
分布函数名字的前缀有四种:
- d - 概率密度函数
- p - 概率密度积分函数(从无限小到 x 的积分)
- q - 分位数函数
- r - 随机数函数(常用于概率仿真)
注:由于本教程不是阐述数学专业理论的教程,所以对有关概率分布的数学理论不作详细解释。R 语言除了含有正态分布函数以外还有泊松分布 (pois, Poisson) 等常见分布函数,如果想详细了解可以学习"概率论与数理统计"。