R语言笔记之数值与逻辑运算

R语言常见运算符

R语言中常见的数学运算符如下所示:

运算符号 描述 示例
x + y 相加 2+3=5
x - y 相减 8-2=6
x * y 相乘 3*2=6
x / y 除以 10/5=2
x^yx**y 2^5=32
x %% y x被y整除后的余数(x对y求模) 7%%3=1
x %/%y x整除y,仅保留整数部分 7%/%3=2

R语言常见数学函数

常见数学函数如下所示:

函数 功能
abs(x) 取x的绝对值
log(x, base=y) 以y为底,求x的对数,默认情况下返回自然对数
exp(x) 返回x的自然指数
sqrt(x) 返回x的平方根
factorial(x) x的阶乘(x!)
choose(x,y) 计算从x个可选元素中选择y个可能的组合数

例如,现在求1、2、3这个三个数字的log值(自然对数),如下所示:

1
2
> log(1:3)
[1] 0.0000000 0.6931472 1.0986123

如果要计算以2为底的对数,需要添加base=2参数,如下所示:

1
2
> log(1:3, base = 2)
[1] 0.000000 1.000000 1.584963

如果要计算以2为底,10为底的对数,直接使用log2()log10()即可。

科学计数法

在R中,可以使用科学计数法,如下所示:

1
2
3
4
> 1.2e3
[1] 1200
> 1.2e-3
[1] 0.0012

如果要取消科学计算法,操作如下:

1
2
3
4
options(scipen = 200)
#scipen 表示在200个数字以内都不使用科学计数法
options(digits = 3)
# 保留小数点后三位

format()函数输出科学计数法:

1
2
3
4
5
format(c(6.0, 13.1), digits = 2)
#保留两位有效数字
format(2^31-1, scientific = TRUE)
format(2^31-1, scientific = FALSE)
#用科学计数法表示该数值,如果想显示全的话可以把scientific设置为FALSE

结果如下所示:

1
2
3
4
5
> format(2^31-1, scientific = TRUE)
[1] "2.147484e+09"
> format(2^31-1, scientific = FALSE)
[1] "2147483647"
> #用科学计数法表示该数值,如果想显示全的话可以把scientific设置为FALSE

各种近似值

常规近似值round()

R最多可以表示多达16位精度的数据,但实际中用不了那么多,可以使用近似值round,并添加上digits参数,如下所示:

1
2
> round(123.4567, digits=2)
[1] 123.46

如果要精确到百位,可以传入负数,如下所示:

1
2
> round(123.4567, digits=-2)
[1] 100

有效数字signif()

如果只关心有效数据,可以使用signif()函数,如下所示:

1
2
> signif(123.456, digits=3)
[1] 123

向下取整floor()

floor(x)朝小于x的近似整数近似,如下所示:

1
2
3
4
> floor(123.45)
[1] 123
> floor(-123.45)
[1] -124

向上取整ceiling()

ceiling(x)朝大于x的最近整数近似,如下所示:

1
2
3
4
> ceiling(123.45)
[1] 124
> ceiling(-123.456)
[1] -123

截取整数部分trunc()

trunc(x)直接截取整数部分,如下所示:

1
2
3
4
> trunc(123.45)
[1] 123
> trunc(-123.45)
[1] -123

三角函数

R中含有完整的三角函数,例如?Trig就能获取相关的帮忙文档,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Trig {base} R Documentation
Trigonometric Functions
Description
These functions give the obvious trigonometric functions. They respectively compute the cosine, sine, tangent, arc-cosine, arc-sine, arc-tangent, and the two-argument arc-tangent.
cospi(x), sinpi(x), and tanpi(x), compute cos(pi*x), sin(pi*x), and tan(pi*x).
Usage
cos(x)
sin(x)
tan(x)
acos(x)
asin(x)
atan(x)
atan2(y, x)
cospi(x)
sinpi(x)
tanpi(x)

余弦值cos()

R中使用的是弧度值,而非角度值,因此直接使用角度会出问题,例如我们现在如果要计算120度的余弦值,输入cos(180),如下所示:

1
2
> cos(120)
[1] 0.814181

此时其实计算提180这个弧度的余弦值,因此如果要计算一个角度的余弦值,需要使用名为pi的特殊变量,它表示π的值,如下所示:

1
2
3
4
> pi
[1] 3.141593
> cos(120*pi/180)
[1] -0.5

R中表示数值的特殊符号

在一些情况下,总有一些数字没法具体表示,例如在R中常常会见到NAInf等这种符号。

无穷大Inf

例如当我们使用0作为除数的时候,结果就是Inf,如下所示:

1
2
> 2/0
[1] Inf

Inf就表示无穷大,它是Infinity的缩写,负无穷大则是-Inf。如果要检查一个数是否为无穷,可以使用is.finite()is.infinite()函数,当一个数是有限大时,is.finite()返回TRUE,如果一个数为无穷大时,is.infinite()返回TRUE,如下所示:

1
2
> is.finite(10^(305:310))
[1] TRUE TRUE TRUE TRUE FALSE FALSE

无定义NaN

在R中,还有一种计算结果是NaN,它是Not a Number的缩写,它表示无定义数,如下所示:

1
2
> Inf / Inf
[1] NaN

虽然NaN表示无定义,但在R中,它还是可以视为一个数,也能运算,如下所示:

1
2
> NaN + 4
[1] NaN

缺失值NA

R使用NA来表示缺失值,它是Not Available的它定,但它也可以当作一个数字来使用,并且可以赋值给其它变量,如下所示:

1
2
3
4
5
> x <- NA
> x + 4
[1] NA
> log(x)
[1] NA

使用is.na()函数可以用于检测NA值,如下所示:

1
2
> is.na(x)
[1] TRUE

需要注意的是,对于NaNis.na()函数也会返回TRUE,但is.finite()is.infinite()is.nan()则会返回FALSE,如下所示:

1
2
3
4
5
6
7
8
> is.na(NaN)
[1] TRUE
> is.finite(NaN)
[1] FALSE
> is.infinite(NaN)
[1] FALSE
> is.nan(NaN)
[1] TRUE

总结一下前面几种函数对于上述特殊值的计算结果,如下所示:

Function Inf -Inf NaN NA
is.finite() FALSE FALSE FALSE FALSE
is.infinite() TRUE TRUE FALSE FALSE
is.nan() FALSE FALSE TRUE FALSE
is.na() FALSE FALSE TRUE TRUE

NULL值

NULL是一个特殊值,它与前面的那三个特殊符号不同,NULL表示的是一个空的变量,它最常用于列表中。例如当我们在创建列表中,我们可能想指定一个元素,表示它必须存在,但是暂没有赋值,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uk_bank_holidays_2013 <- list(
Jan = "New Year's Day",
Feb = NULL,
Mar = "Good Friday",
Apr = "Easter Monday",
May = c("Early May Bank Holiday", "Spring Bank Holiday"),
Jun = NULL,
Jul = NULL,
Aug = "Summer Bank Holiday",
Sep = NULL,
Oct = NULL,
Nov = NULL,
Dec = c("Christmas Day", "boxing Day")
)
uk_bank_holidays_2013

结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
> uk_bank_holidays_2013
$Jan
[1] "New Year's Day"
$Feb
NULL
$Mar
[1] "Good Friday"
$Apr
[1] "Easter Monday"
$May
[1] "Early May Bank Holiday" "Spring Bank Holiday"
$Jun
NULL
$Jul
NULL
$Aug
[1] "Summer Bank Holiday"
$Sep
NULL
$Oct
NULL
$Nov
NULL
$Dec
[1] "Christmas Day" "boxing Day"

NULL和NA的区别还在于,NA是一个标量值,而NULL不会占用任何空间,它的长度零,如下所示:

1
2
3
4
> length(NULL)
[1] 0
> length(NA)
[1] 1

R中缺失值的处理complte.cases()

使用complete.cases函数可以找出哪些行没有缺失值,现在演示一下。

这里使用的数据是learningr包中的数据。

1
2
3
library(learningr)
data("deer_endocranial_volume")
head(deer_endocranial_volume)

运行结果如下所示:

1
2
3
4
5
6
7
8
> head(deer_endocranial_volume)
SkullID VolCT VolBead VolLWH VolFinarelli VolCT2 VolBead2 VolLWH2
1 DIC44 389 375 1484 337 NA NA NA
2 B11 389 370 1722 377 NA NA NA
3 DIC90 352 345 1495 328 NA NA NA
4 DIC83 388 370 1683 377 NA NA NA
5 DIC787 375 355 1458 328 NA NA NA
6 DIC1573 325 320 1363 291 NA NA NA

从中我们可以发现,有一些值是NA

假如我们不想要这些带有NA的数据,就可以使用complete.cases()函数,如下所示:

1
2
3
has_all_measurements <- complete.cases(deer_endocranial_volume)
table(has_all_measurements)
deer_endocranial_volume[has_all_measurements,]

运行结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> has_all_measurements <- complete.cases(deer_endocranial_volume)
> table(has_all_measurements)
has_all_measurements
FALSE TRUE
24 9
> deer_endocranial_volume[has_all_measurements,]
SkullID VolCT VolBead VolLWH VolFinarelli VolCT2 VolBead2 VolLWH2
7 C120 346 335 1250 289 346 330 1264
8 C25 302 295 1011 250 303 295 1009
9 F7 379 360 1621 347 375 365 1647
10 B12 410 400 1740 387 413 395 1728
11 B17 405 395 1652 356 408 395 1639
12 B18 391 370 1835 419 394 375 1825
13 J7 416 405 1834 408 417 405 1876
15 A4 336 330 1224 283 345 330 1192
20 K2 349 355 1239 286 354 365 1243

从上面结果可以看出来,含有NA的行是24个,含有TRUE的行是9个,使用complete.cases(deer_endocranial_volume)去除掉含有NA的行外,剩下9行,也就是不含NA的行。

anyall

anyall是处理逻辑向量的函数,如果输入向量中至少包含一个TRUE值或只包含TRUE值,它们将返回TRUE,如下所示:

1
2
3
4
5
6
7
8
9
none_true <- c(FALSE, FALSE, FALSE)
some_true <- c(FALSE, TRUE, FALSE)
all_true <- c(TRUE, TRUE, TRUE)
any(none_true)
any(some_true)
any(all_true)
all(none_true)
all(some_true)
all(all_true)

运行结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
> any(none_true)
[1] FALSE
> any(some_true)
[1] TRUE
> any(all_true)
[1] TRUE
> all(none_true)
[1] FALSE
> all(some_true)
[1] FALSE
> all(all_true)
[1] TRUE

参考资料

  1. R语言轻松入门与提高 [法]Andrie de Vries ,[比利时]Joris Mey [法] Andrie de Vries 著
  2. 学习R.[美] Richard,Cotton 著刘军 译