1  R 语言基础

R是一款用于统计、数据可视化的语言和环境。R是一个自由、免费、源代码开放的软件。是一个由统计计算和统计制图优秀的工具。

本书所使用的是quarto来实现的编译。关于这个的更多详细的内容可以参阅https://quarto.org/

1.0.1 四则运算

5 + (2.3 - 1.125)*3.2/1.1 + 1.23E3
[1] 1238.418

1.0.2 乘方运算

3^3
[1] 27

1.0.3 数学函数

sqrt(10)
[1] 3.162278
sqrt(16)
[1] 4

1.0.3.1 三角函数

asin(1)
[1] 1.570796
sin(pi/2)
[1] 1

1.0.4 概率函数

dnorm(2,mean=0,sd=1) #parameter=x,mean=,sd=
[1] 0.05399097
pnorm(10,1,1)
[1] 1

1.1 向量与矩阵

1.1.1 数值型向量

marks <- c(10, 6, 4, 7, 8)
x <- c(1:3, 10:13)
x1 <- c(1, 2)
x2 <- c(3, 4)
x <- c(x1, x2)
x
[1] 1 2 3 4
5%%3 #求余数
[1] 2
sqrt(-1)
Warning in sqrt(-1): NaNs produced
[1] NaN
sqrt(-1+0i)
[1] 0+1i

1.1.2 逻辑型向量

sale<-(log10(15)<2);
print(sale)
[1] TRUE
c(1,2,3)>2
[1] FALSE FALSE  TRUE
1:4>=(4:1)
[1] FALSE FALSE  TRUE  TRUE

%in%是一个较为特殊的运算,x%in%y表示的是把向量y看作一个集合,运算的结果返回的是一个向量。

c(1,3)%in% c(2,3,4)
[1] FALSE  TRUE

which()函数返回真值对应的下标。

which(c(FALSE,TRUE,FALSE,TRUE))
[1] 2 4

对于一个真-假向量,只能输入这两类,输入数值型会发生报错。

identical(x,y对两个R对象进行比较,需要确定xy之间完全相同与否。比如在向量/矩阵中若一个元素不完全相同,则实际是不同的。

x=1;y=1
identical(x,y)
[1] TRUE
identical(c(NA,1,2),c(NA,2,2))
[1] FALSE

1.1.2.1 矩阵生成

X=matrix(1:9,nrow = 3,ncol = 3)
Y=matrix(1:9,nrow = 3,ncol = 3)
identical(X,Y)
[1] TRUE
Y2=matrix(c(1,2,3,4,5,6,7,8,8),3,3)
identical(X,Y2)
[1] FALSE

all.equal()identical()类似,但比较时候不区分数据类型。

all.equal(c(1,2,3),c(1,2,NA))
[1] "'is.NA' value mismatch: 1 in current 0 in target"
all.equal(c(1L,2L,3L), c(1,2,3))
[1] TRUE

duplicated()返回是是否在集合(向量)中为重复值,是否为重复值,是根据前面的进行遍历得到,若之前的数据已经检测append进入队列,再进入就是重复值。因此未出现返回FALSE,之前已经出现则TRUE

1.1.3 字符型向量

s1 <- c('abc', 's', 'a cat', NA, '李明') 

paste()是用于连接两个字符型向量,元素可以一一对应的连接;对于数值与字符型时候,采用的是一对多的形式进行连接,自动将数值型向量转换为字符型。

paste("x",1:3)
[1] "x 1" "x 2" "x 3"
paste(c("ab", "cd"), c("ef", "gh"))
[1] "ab ef" "cd gh"

1.1.4 向量下标与子集

在这里的向量下标不同于python的数组下标,第一个元素的下标用x[1]取出,同样不同的:python用x[-1]取出最后一个元素;而R用x[-1]所取的是除去x[1]之后的元素全部取出。 R的实现:

x<-c(1,5,10,20,25)
x[-1]
[1]  5 10 20 25

x[]表示的是全部取出作为子集,但这与x本身并不相同:

1.1.4.1 逻辑下标

x <- c(1,20,50,100)
x[x>30]
[1]  50 100

1.1.4.2 which()

which()可用于找到想要的下标。

x <- c(3, 4, 3, 5, 7, 5, 9)
which(x > 5)
[1] 5 7

1.1.4.3 元素名

向量的命名方式

attr <- c("age"=11,"gender"=0)
names(attr)
[1] "age"    "gender"

1.2 矩阵计算

eigen(A)可用于计算特征值和对应的特征向量。

library(Matrix)
A=matrix(c(1,3,2,1,9,2,4,8,1), nrow = 3, ncol = 3)
eigen(A)
eigen() decomposition
$values
[1] 11.378681 -2.119875  1.741194

$vectors
           [,1]       [,2]       [,3]
[1,] -0.1768558 -0.7291364 -0.7283130
[2,] -0.9595649 -0.2590188  0.6207838
[3,] -0.2189914  0.6334583 -0.2901513

det()是用于计算determinant矩阵行列式;solve()用于计算矩阵的逆。

det(A)
[1] -42
solve(A)%*%A
              [,1]          [,2]          [,3]
[1,]  1.000000e+00 -2.220446e-16 -1.110223e-16
[2,] -2.775558e-17  1.000000e+00  6.938894e-17
[3,]  0.000000e+00  0.000000e+00  1.000000e+00

1.2.1 矩阵求秩

qr()是利用QR分解来得到上三角和下三角,同时还可以获得矩阵的秩。

qr(A)$qr
           [,1]       [,2]      [,3]
[1,] -3.7416574 -8.5523597 -8.017837
[2,]  0.8017837 -3.5856858 -2.629503
[3,]  0.5345225 -0.5658953 -3.130495
qr(A)$rank # or qr.default(A)$rank
[1] 3

1.2.1.1 矩阵求迹

sum(diag(A))
[1] 11

1.2.1.2 矩阵求幂

2^A
     [,1] [,2] [,3]
[1,]    2    2   16
[2,]    8  512  256
[3,]    4    4    2
expm(A)
3 x 3 Matrix of class "dgeMatrix"
          [,1]     [,2]     [,3]
[1,]  5842.413 12351.36 11775.15
[2,] 31678.323 67023.00 63868.46
[3,]  7231.512 15295.15 14578.02

1.2.1.3 单位矩阵

diag(rep(3))
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1
rep(1,3) %o% rep(1,3)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

1.2.1.4 对角矩阵

diag(A)
[1] 1 9 1
diag(diag(A))
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    9    0
[3,]    0    0    1

colsums计算矩阵的列和,返回值为列的和,与所取矩阵及其范围相关

rowsums计算的是矩阵的各行的和;

colMeans(A)求各行的均值

1.2.1.5 矩阵求和:

rowSums()# 对于多列的进行求和; sum()

rowSums(A)
[1]  6 20  5
sum(A)
[1] 31

1.3 函数

在任何的编程语言中,函数是一个重要的组成部分,而不同的编程语言的函数输入方法并不相同。

  • formal(),即函数的形式参数表以及可能存在的缺省值,这是一个列表对象;

  • 函数体body(),函数内部的代码

  • 环境(),是函数定义时所处的环境, 这会影响到参数表中缺省值与函数体中非局部变量的的查找。

函数体并不是函数对象的必要组成部分。

f02 <- function(x, y) {
  # A comment
  x + y
}
formals(f02)
#> $x
#> 
#> 
#> $y

body(f02)
#> {
#>     x + y
#> }

environment(f02)
#> <environment: R_GlobalEnv>

函数的自变量是只读的,函数中定义的局部变量只在函数运行时候起作用,并不会与外界环境相互冲突。

1.3.1 函数定义

函数的格式为:

函数名 <- function(形式参数表) 函数体

其中的函数体是一个复合表达式,以复合表达式中最后一个表达式为返回值,也可以用return(返回值)来表示返回值。同时返回值也可空缺。

f <- function() {
  x <- seq(0, 2*pi, length=50)
  y1 <- sin(x)
  y2 <- cos(x)
  plot(x, y1, type="l", lwd=2, col="red",
       xlab="x", ylab="")
  lines(x, y2, lwd=2, col="blue")
  abline(h=0, col="gray")
}
f()

R中函数可以进行向量化,即传入参数x若是一个向量,则返回的结果也会是一个向量形式。