R 基础运算

本章介绍 R 语言的简单运算。

赋值

一般语言的赋值是 = 号,但是 R 语言是数学语言,所以赋值符号与我们数学书上的伪代码很相似,是一个左箭头 <-

实例

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

关系运算符

下表列出了 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 )

执行以上代码输出结果为:

									[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 语言支持的逻辑运算符,可用于数字、逻辑和复数类型的向量。

非 0 的数字(正数或负数)都为 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 , ,TRUE, 2 + 2i )
t <- c ( 1 , 3 ,TRUE, 2 + 3i )
print ( v && t )

v <- c ( , ,TRUE, 2 + 2i )
t <- c ( , 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, "yssmx" )
v2 <<- c ( 3 , 1 ,TRUE, "yssmx" )
v3 = c ( 3 , 1 ,TRUE, "yssmx" )
print ( v1 )
print ( v2 )
print ( v3 )


# 向右赋值
c ( 3 , 1 ,TRUE, "yssmx" ) -> v1
c ( 3 , 1 ,TRUE, "yssmx" ) ->> v2
print ( v1 )
print ( v2 )

执行以上代码输出结果为:

									[1] "3"      "1"      "TRUE"   "yssmx"
[1] "3"      "1"      "TRUE"   "yssmx"
[1] "3"      "1"      "TRUE"   "yssmx"
[1] "3"      "1"      "TRUE"   "yssmx"
[1] "3"      "1"      "TRUE"   "yssmx"
								

其他运算符

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]  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

取整函数:

名称 参数模型 含义
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

注意 :R 中的 round 函数有些情况下可能会"舍掉五"。

当取整位是偶数的时候,五也会被舍去,这一点与 C 语言有所不同。

R 的三角函数是弧度制:

实例

> 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

如果学习过概率论和统计学,应该对以下的概率分布函数比较了解,因为 R 语言为数学工作者设计,所以经常会用到:

实例

> dnorm ( )
[ 1 ] 0.3989423
> pnorm ( )
[ 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) 等常见分布函数,如果想详细了解可以学习"概率论与数理统计"。