本章介紹 R 語言的簡單運算。
一般語言的賦值是 = 號,但是 R 語言是數(shù)學(xué)語言,所以賦值符號與我們數(shù)學(xué)書上的偽代碼很相似,是一個左箭頭 <- :
a <- 123 b <- 456 print(a + b)
以上代碼執(zhí)行結(jié)果:
[1] 579
這個賦值符號是 R 語言的一個形式上的優(yōu)點和操作上的缺點:形式上更適合數(shù)學(xué)工作者,畢竟不是所有的數(shù)學(xué)工作者都習(xí)慣于使用 = 作為賦值符號。
操作上來講,< 符號和 - 符號都不是很好打的字符,這會讓很多程序員不適應(yīng)。因此,R 語言的比較新的版本也支持 = 作為賦值符:
a = 123 b = 456 print(a + b)
這也是合法的 R 程序。
注意:很難考證從 R 的哪個版本開始支持了 = 賦值,但是本教程習(xí)用的 R 版本是 4.0.0。
下表列出了主要的數(shù)學(xué)運算符以及他們的運算順序:
優(yōu)先級 | 符號 | 含義 |
---|---|---|
1 | () | 括號 |
2 | ^ | 乘方運算 |
3 | %% | 整除求余 |
%/% | 整除 | |
4 | * | 乘法 |
/ | 除法 | |
5 | + | 加法 |
- | 減法 |
以下示例演示了簡單的數(shù)學(xué)運算:
> 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 語言支持的關(guān)系運算符,關(guān)系運算符比較兩個向量,將第一向量與第二向量的每個元素進(jìn)行比較,結(jié)果返回一個布爾值。
運算符 | 描述 |
---|---|
> | 判斷第一個向量的每個元素是否大于第二個向量的相對應(yīng)元素。 |
< | 判斷第一個向量的每個元素是否小于第二個向量的相對應(yīng)元素。 |
== | 判斷第一個向量的每個元素是否等于第二個向量的相對應(yīng)元素。 |
!= | 判斷第一個向量的每個元素是否不等于第二個向量的相對應(yīng)元素。 |
>= | 判斷第一個向量的每個元素是否大于等于第二個向量的相對應(yīng)元素。 |
<= | 判斷第一個向量的每個元素是否小于等于第二個向量的相對應(yīng)元素。 |
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)
執(zhí)行以上代碼輸出結(jié)果為:
[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 語言支持的邏輯運算符,可用于數(shù)字、邏輯和復(fù)數(shù)類型的向量。
大于 1 的數(shù)字都為 TRUE。
邏輯運算符比較兩個向量,將第一向量與第二向量的每個元素進(jìn)行比較,結(jié)果返回一個布爾值。
運算符 | 描述 |
---|---|
& | 元素邏輯與運算符,將第一個向量的每個元素與第二個向量的相對應(yīng)元素進(jìn)行組合,如果兩個元素都為 TRUE,則結(jié)果為 TRUE,否則為 FALSE。 |
| | 元素邏輯或運算符,將第一個向量的每個元素與第二個向量的相對應(yīng)元素進(jìn)行組合,如果兩個元素中有一個為 TRUE,則結(jié)果為 TRUE,如果都為 FALSE,則返回 FALSE。 |
! | 邏輯非運算符,返回向量每個元素相反的邏輯值,如果元素為 TRUE 則返回 FALSE,如果元素為 FALSE 則返回 TRUE。 |
&& | 邏輯與運算符,只對兩個向量對第一個元素進(jìn)行判斷,如果兩個元素都為 TRUE,則結(jié)果為 TRUE,否則為 FALSE。 |
|| | 邏輯或運算符,只對兩個向量對第一個元素進(jìn)行判斷,如果兩個元素中有一個為 TRUE,則結(jié)果為 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) # &&、||只對第一個元素進(jìn)行比較 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)
執(zhí)行以上代碼輸出結(jié)果為:
[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,"nhooo") v2 <<- c(3,1,TRUE,"nhooo") v3 = c(3,1,TRUE,"nhooo") print(v1) print(v2) print(v3) # 向右賦值 c(3,1,TRUE,"nhooo") -> v1 c(3,1,TRUE,"nhooo") ->> v2 print(v1) print(v2)
執(zhí)行以上代碼輸出結(jié)果為:
[1] "3" "1" "TRUE" "nhooo" [1] "3" "1" "TRUE" "nhooo" [1] "3" "1" "TRUE" "nhooo" [1] "3" "1" "TRUE" "nhooo" [1] "3" "1" "TRUE" "nhooo"
R 語言還包含了一些特別的運算符。
運算符 | 描述 |
---|---|
: | 冒號運算符,用于創(chuàng)建一系列數(shù)字的向量。 |
%in% | 用于判斷元素是否在向量里,返回布爾值,有的話返回 TRUE,沒有返回 FALSE。 |
%*% | 用于矩陣與它轉(zhuǎn)置的矩陣相乘。 |
# 1 到 10 的向量 v <- 1:10 print(v) # 判斷數(shù)字是否在向量 v 中 v1 <- 3 v2 <- 15 print(v1 %in% v) print(v2 %in% v) # 矩陣與它轉(zhuǎn)置的矩陣相乘 M = matrix( c(2,6,5,1,10,4), nrow = 2,ncol = 3,byrow = TRUE) t = M %*% t(M) print(t)
執(zhí)行以上代碼輸出結(jié)果為:
[1] 1 2 3 4 5 6 7 8 9 10 [1] TRUE [1] FALSE [,1] [,2] [1,] 65 82 [2,] 82 117
常見對一些數(shù)學(xué)函數(shù)有:
函數(shù) | 說明 |
---|---|
sqrt(n) | n的平方根 |
exp(n) | 自然常數(shù)e的n次方, |
log(m,n) | m的對數(shù)函數(shù),返回n的幾次方等于m |
log10(m) | 相當(dāng)于log(m,10) |
以下示例演示了數(shù)學(xué)函數(shù)的應(yīng)用:
> sqrt(4) [1] 2 > exp(1) [1] 2.718282 > exp(2) [1] 7.389056 > log(2,4) [1] 0.5 > log10(10000) [1] 4
取整函數(shù):
名稱 | 參數(shù)模型 | 含義 |
---|---|---|
round | (n) | 對 n 四舍五入取整 |
(n, m) | 對 n 保留 m 位小數(shù)四舍五入 | |
ceiling | (n) | 對 n 向上取整 |
floor | (n) | 對 n 向下取整 |
以下示例演示了取整函數(shù)的應(yīng)用:
> round(1.5) [1] 2 > round(2.5) [1] 2 > round(3.5) [1] 4 > round(4.5) [1] 4
注意:R 中的 round 函數(shù)有些情況下可能會"舍掉五"。
當(dāng)取整位是偶數(shù)的時候,五也會被舍去,這一點與 C 語言有所不同。
R 的三角函數(shù)是弧度制:
> sin(pi/6) [1] 0.5 > cos(pi/4) [1] 0.7071068 > tan(pi/3) [1] 1.732051
反三角函數(shù):
> asin(0.5) [1] 0.5235988 > acos(0.7071068) [1] 0.7853981 > atan(1.732051) [1] 1.047198
如果學(xué)習(xí)過概率論和統(tǒng)計學(xué),應(yīng)該對以下的概率分布函數(shù)比較了解,因為 R 語言為數(shù)學(xué)工作者設(shè)計,所以經(jīng)常會用到:
> dnorm(0) [1] 0.3989423 > pnorm(0) [1] 0.5 > qnorm(0.95) [1] 1.644854 > rnorm(3, 5, 2) # 產(chǎn)生 3 個平均值為 5,標(biāo)準(zhǔn)差為 2 的正態(tài)隨機數(shù) [1] 4.177589 6.413927 4.206032
這四個都是用來計算正態(tài)分布的函數(shù)。它們的名字都以 norm 結(jié)尾,代表"正態(tài)分布"。
分布函數(shù)名字的前綴有四種:
d - 概率密度函數(shù)
p - 概率密度積分函數(shù)(從無限小到 x 的積分)
q - 分位數(shù)函數(shù)
r - 隨機數(shù)函數(shù)(常用于概率仿真)
注:由于本教程不是闡述數(shù)學(xué)專業(yè)理論的教程,所以對有關(guān)概率分布的數(shù)學(xué)理論不作詳細(xì)解釋。R 語言除了含有正態(tài)分布函數(shù)以外還有泊松分布 (pois, Poisson) 等常見分布函數(shù),如果想詳細(xì)了解可以學(xué)習(xí)"概率論與數(shù)理統(tǒng)計"。