R语言 向量与矩阵

2020-10-28 14:49:47 浏览数 (1)

不登高山,不知天之高也;不临深溪,不知地之厚也。 ——荀子

这篇文章讲述的是R语言中关于向量与矩阵的相关知识。希望这篇R语言文章对您有所帮助!如果您有想学习的知识或建议,可以给作者留言~

一、创建向量和矩阵

  • 1、创建向量:c(),查看长度length(),查看类型mode()

1、创建向量

代码语言:javascript复制
# 创建向量
x1 <- c(2,4,6,8,0)
x2 <- c(1,3,5,7,9)

# 创建字符串向量
> y <- c("li","hua","xin")
> y
[1] "li"  "hua" "xin"

# 创建从1到100的向量
a1 <- c(1:100)

# 查看向量x1的内容
> x1
[1] 2 4 6 8 0

# 查看向量x1中的第三个数
> x1[3]
[1] 6

2、查看向量的长度和类型

代码语言:javascript复制
# 查看字符串向量
> mode(y)
[1] "character"

# 查看向量的长度
> length(x1)
[1] 5

# 查看向量的类型
> mode(x1)
[1] "numeric"
  • 2、创建矩阵:rbind(),cbind()

1、rbind() # 按行组合矩阵

代码语言:javascript复制
> rbind(x1,x2)
   [,1] [,2] [,3] [,4] [,5]
x1    2    4    6    8    0
x2    1    3    5    7    9

2、cbind() # 按列组合矩阵

代码语言:javascript复制
> cbind(x1,x2)
     x1 x2
[1,]  2  1
[2,]  4  3
[3,]  6  5
[4,]  8  7
[5,]  0  9

二、求平均值,和,连乘,最值,方差,标准差

  • 函数:mean(),sum(),min(),max(),var(),sd(),prod()

创建了向量之后就可以进行求值了

代码语言:javascript复制
> x <- c(1:100)

# 平均数
> mean(x)
[1] 50.5

# 求和
> sum(x)
[1] 5050

# 最大值
> max(x)
[1] 100

# 最小值
> min(x)
[1] 1

# 求方差  反应了数据离散的情况,方差越大离散越大
> var(x)
[1] 841.6667

# 连乘
> prod(x)
[1] 9.332622e 157

# 标准差
> sd(x)
[1] 29.01149

三、向量部分

此部分为向量的一些写法以及计算技巧

  • 1
代码语言:javascript复制
#  创建一个1到10的向量
> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10

# 向量中每一个数都减1
> 1:10-1
 [1] 0 1 2 3 4 5 6 7 8 9

# 向量中每一个数都乘以2
> 1:10*2
 [1]  2  4  6  8 10 12 14 16 18 20

# 向量中每一个数都乘以2加1 
> 1:10*2 1
 [1]  3  5  7  9 11 13 15 17 19 21


> a <- 1:60*2 1
> a
 [1]   3   5   7   9  11  13  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43  45
[23]  47  49  51  53  55  57  59  61  63  65  67  69  71  73  75  77  79  81  83  85  87  89
[45]  91  93  95  97  99 101 103 105 107 109 111 113 115 117 119 121

# a向量中下标为5的数的值
> a[5]
[1] 11


> a[5]
[1] 13


> a <- 2:60*2 1

> # a向量中下标除了5以外的所有元素
> a[-5]
 [1]   5   7   9  11  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43  45  47  49
[23]  51  53  55  57  59  61  63  65  67  69  71  73  75  77  79  81  83  85  87  89  91  93
[45]  95  97  99 101 103 105 107 109 111 113 115 117 119 121

# 向量a中前五个元素
> a[1:5]
[1]  5  7  9 11 13

# 向量a中除了前五个下标以外对应的数
> a[-(1:5)]
 [1]  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43  45  47  49  51  53  55  57
[23]  59  61  63  65  67  69  71  73  75  77  79  81  83  85  87  89  91  93  95  97  99 101
[45] 103 105 107 109 111 113 115 117 119 121

#  错误,度量值不对
> a[1,2,3]
Error in a[1, 2, 3] : incorrect number of dimensions

# 向量a中的第2,4,7个元素
> a[c(2,4,7)]
[1]  7 11 17

#  向量a中第三个到第八个元素的内容
> a[3:8]
[1]  9 11 13 15 17 19

#  向量a中小于20的元素
> a[a<20]
[1]  5  7  9 11 13 15 17 19

#  向量a中中大于30小于50的元素
> a[a>30 & a<50]
 [1] 31 33 35 37 39 41 43 45 47 49

#  向量a中前三个元素相加
> a[a[3]]
[1] 21
  • 2、Seq()函数

Seq()函数可以按照指定的规律创建向量

代码语言:javascript复制
# 创建一个从5到20的向量
> seq(5,20)
 [1]  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

# 创建一个从5到121的向量,公差为2
> seq(5,121,by=2)
 [1]   5   7   9  11  13  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43  45  47
[23]  49  51  53  55  57  59  61  63  65  67  69  71  73  75  77  79  81  83  85  87  89  91
[45]  93  95  97  99 101 103 105 107 109 111 113 115 117 119 121

# by 和 length 不能同时指定
> seq(5,121,by=2,length=10)
Error in seq.default(5, 121, by = 2, length = 10) : 太多参数

# 创建一个从5到121的向量,总共有10项,自动计算公差
> seq(5,121,length=10)
 [1]   5.00000  17.88889  30.77778  43.66667  56.55556  69.44444  82.33333  95.22222 108.11111
[10] 121.00000
  • 3、产生字母序列letters
代码语言:javascript复制
# 生成字母序列,超过部分 NA自动补齐
> letters[1:30]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v"
[23] "w" "x" "y" "z" NA  NA  NA  NA 
  • 4、which()函数
代码语言:javascript复制
> a <- c(2,3,4,2,5,1,6,3,2,5,8,5,7,3)

# 向量中最大值的下标
> which.max(a)
[1] 11

# 向量中最小值的下标
> which.min(a)
[1] 6

# 最小下标的值
> a[which.min(a)]
[1] 1

# 向量中值为2的下标
> which(a==2)
[1] 1 4 9

# 向量中为2的元素
> a[which(a==2)]
[1] 2 2 2

# 向量中值大于5的下标
> which(a>5)
[1]  7 11 13

# 向量中大于5的元素
> a[which(a>5)]
[1] 6 8 7
  • 5、rev()函数,sort()函数
代码语言:javascript复制
> a <- 1:20
> a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

# 倒序向量
> rev(a)
 [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

# 随机创一个向量
> a <- c(2,3,4,2,5,1,6,3,2,5,8,5,7,3)

# 排序向量
> sort(a)
 [1] 1 2 2 2 3 3 3 4 5 5 5 6 7 8

# 把排序好的向量倒序
> rev(sort(a))
 [1] 8 7 6 5 5 5 4 3 3 3 2 2 2 1

四、矩阵部分

此部分为矩阵的一些写法以及计算技巧

  • 1、matrix()函数

创建矩阵用matrix()函数

代码语言:javascript复制
>  a1 <- c(1:12)

# 创建一个三行四列的矩阵
> matrix(a1,3,4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

# 创建一个四行三列的矩阵,如果不设置byrow,则默认为从上到下排序
> matrix(a1,4,3)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

# 创建一个四行三列的矩阵
> matrix(a1,4,3,TRUE)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
  • 2、t()函数

实现矩阵的转置,行变列,列变行

代码语言:javascript复制
> a <- matrix(1:12,nrow = 3,ncol = 4)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

#  行列互换
> t(a)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
  • 3、矩阵加减
代码语言:javascript复制
> a <- b <- matrix(1:12,nrow = 3,ncol = 4)
> a b
     [,1] [,2] [,3] [,4]
[1,]    2    8   14   20
[2,]    4   10   16   22
[3,]    6   12   18   24
> a-b
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0
  • 4、矩阵相乘
代码语言:javascript复制
> a <- matrix(1:12,nrow = 3,ncol = 4)
> b <- matrix(1:12,nrow = 4,ncol = 3)
> a%*%b            线代矩阵相乘
     [,1] [,2] [,3]
[1,]   70  158  246
[2,]   80  184  288
[3,]   90  210  330
  • 5、diag()函数

求对角线,diag()函数

代码语言:javascript复制
> a <- matrix(1:16,nrow = 4,ncol = 4)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

# 返回对角线
> diag(a)
[1]  1  6 11 16

# 对角线矩阵
> diag(diag(a))
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    6    0    0
[3,]    0    0   11    0
[4,]    0    0    0   16

# 产生一个四阶的单位矩阵
> diag(4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1
  • 6、矩阵求逆,逆矩阵

solve()函数

代码语言:javascript复制
# 先使用rnorm函数随机生成16个随机数,并创建矩阵
> a <- matrix(rnorm(16),4,4)
> a
            [,1]        [,2]       [,3]       [,4]
[1,]  0.19496384 -1.32876618  0.8009854  0.1090159
[2,]  0.83996855 -1.31302374  0.4815483 -0.2333306
[3,] -1.71094415  0.03186264 -0.5280415  2.3790375
[4,] -0.03161188  0.85040187  0.4736652 -0.5227957

# solve()函数可以直接求逆
> solve(a)
           [,1]      [,2]      [,3]     [,4]
[1,] -2.3313965 3.2960835 0.7418279 1.418528
[2,] -1.1575768 1.2092526 0.4392610 1.217815
[3,]  0.1181362 0.8574405 0.4068229 1.493238
[4,] -1.6349574 2.5445791 1.0382558 1.335292
  • 7、解线性方程组

solve()函数还能解线性方程

代码语言:javascript复制
eg: ax=b
> a <- matrix(rnorm(16),4,4)
> a
           [,1]       [,2]       [,3]        [,4]
[1,]  1.2319870 -0.1801956  0.1470676  0.01413551
[2,] -0.2092927  0.2776381  1.0411766  0.44004831
[3,]  1.3762975 -0.6371769 -1.3026650 -1.20290275
[4,]  0.1149844  0.4075077  0.1193776 -0.21052398
> b <- c(1:4)
> b
[1] 1 2 3 4
> solve(a,b)
[1]  0.894783  3.750849  4.723690 -8.572473
  • 8、eigen()函数

用来求矩阵的特征值与特征向量

代码语言:javascript复制
> a <- diag(4) 1
> a
     [,1] [,2] [,3] [,4]
[1,]    2    1    1    1
[2,]    1    2    1    1
[3,]    1    1    2    1
[4,]    1    1    1    2
> a.e = eigen(a,symmetric = T)
> a.e
eigen() decomposition
$values
[1] 5 1 1 1

$vectors
     [,1]       [,2]       [,3]       [,4]
[1,] -0.5  0.8660254  0.0000000  0.0000000
[2,] -0.5 -0.2886751 -0.5773503 -0.5773503
[3,] -0.5 -0.2886751 -0.2113249  0.7886751
[4,] -0.5 -0.2886751  0.7886751 -0.2113249

0 人点赞