• R语言—矩阵


    矩阵

    矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型))。矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。反之,向量却不能看作是只有一列或一行的矩阵。

    创建矩阵

    matrix()函数

    格式:

    matrix(vector, nrow=1,ncol=1,byrow=FALSE, dimnames=…)
    
    • 1

    byrow取值为逻辑变量,表示是否将data中的数据按行放至,默认值为FALSE

    byrow=T改变的只是数据输入的顺序,矩阵本身依然是按列存储

    > x<-matrix(1:12,3,4,byrow = TRUE)
    > x
         [,1] [,2] [,3] [,4]
    [1,]    1    2    3    4
    [2,]    5    6    7    8
    [3,]    9   10   11   12
    > as.vector(x)
     [1]  1  5  9  2  6 10  3  7 11  4  8 12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    举例:

    > a<-matrix(data=1:4,nrow=2,ncol=2)
    > a
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    举例:

    > a<-matrix(1:15,nrow=3)
    > a
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    4    7   10   13
    [2,]    2    5    8   11   14
    [3,]    3    6    9   12   15
    > a<-matrix(1:15,ncol=5)
    > a
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    4    7   10   13
    [2,]    2    5    8   11   14
    [3,]    3    6    9   12   15
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    举例:

    > b<-matrix(nrow=2,ncol=3)
    > b[1,1]=1
    > b[2,1]=2
    > b
         [,1] [,2] [,3]
    [1,]    1   NA   NA
    [2,]    2   NA   NA
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结:

    • 可以只指定行或者列

    • 可以生成一个初始空矩阵,然后再进行赋值

    • NA表示该数据集中的该数据遗失,不存在。在针对具有NA的数据集进行函数操作的时候,该NA不会被直接剔除。

      •   > mean(b[1,])
          [1] NA
          > mean(b[,1])
          [1] 1.5
          
        
        • 1
        • 2
        • 3
        • 4
        • 5

    dim()函数

    可用dim()函数将向量转换成矩阵

    格式:

    dim(x)<-value
    
    • 1

    参数x表示要转换成矩阵的向量,value是表示维数的向量

    举例:

    > x<-1:12
    > dim(x)<-c(3,4)#通过dim函数为向量添加维数来构建矩阵
    > x
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    矩阵的函数

    函数说明
    dim()获取对象(矩阵,数组)的维数,不能获得向量的维数
    nrow()获取矩阵行数
    crow()获取矩阵列数
    as.vector()将矩阵和数组强行转换为向量
    rbind()将向量或者矩阵合并为一个矩阵,按照行合并,即每个子矩阵需要有相同的列数
    cbind()将向量或者矩阵合并为一个矩阵,按照列合并,即每个子矩阵需要有相同的行数
    head()
    tail()

    矩阵的索引

    矩阵下标可以取正整数、负整数,分别表示矩阵下标对应的内容或者去掉矩阵中相应的行和列

    #创建一个3*5的矩阵
    > A<-matrix(1:15,3,5)
    > A
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    4    7   10   13
    [2,]    2    5    8   11   14
    [3,]    3    6    9   12   15
    #取位于第一行第二列的数
    > A[1,2]
    [1] 4
    > A[1,2]<-102
    #取位于1、3行,2~4列的数
    > A[c(1,3),2:4]
         [,1] [,2] [,3]
    [1,]  102    7   10
    [2,]    6    9   12
    #剔除第3行、第2列
    > A[-3,-2]
         [,1] [,2] [,3] [,4]
    [1,]    1    7   10   13
    [2,]    2    8   11   14
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们再来看一个例子:

    > head(state.x77)
    
    • 1

    image-20220901085753902

    > head(state.x77)[,"Income"]
    
    • 1

    image-20220901090123404

    矩阵的行和列的命名问题

    > score<-c(80,90,70,65,87,97,56,78,92)
    > score<-matrix(score,3,3)
    > score
         [,1] [,2] [,3]
    [1,]   80   65   56
    [2,]   90   87   78
    [3,]   70   97   92
    
    > rnames<-c("Linda","James","John")
    > cnames<-c("Eng","Math","R")
    > dimnames(score)<-list(rnames,cnames)
    > score
               Eng   Math     R
    LInda    80     65       56
    James   90    87        78
    John      70    97       92
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    矩阵运算

    函数说明
    rowSums(x)对行求和
    colSums(x)对列求和
    sum(x)矩阵求和
    #创建一个4*5的矩阵
    > x<-matrix(1:20,4,5,byrow=T)
    > x
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    2    3    4    5
    [2,]    6    7    8    9   10
    [3,]   11   12   13   14   15
    [4,]   16   17   18   19   20
    #对行求和
    > rowSums(x)
    [1] 15 40 65 90
    #对列求和
    > colSums(x)
    [1] 34 38 42 46 50
    #矩阵求和
    > sum(x)
    [1] 210
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    矩阵相乘

    > x<-matrix(1:4,nrow=2)
    > x
         [,1] [,2]
    [1,]    1    3
    [2,]    2    4
    # %*% 等同于行列式的乘法
    > x%*%x
         [,1] [,2]
    [1,]    7   15
    [2,]   10   22
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    矩阵与标量相乘

    > x<-matrix(1:4,nrow=2)
    > 3*x
         [,1] [,2]
    [1,]    3    9
    [2,]    6   12
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    矩阵与向量相加

    > x <-matrix(1:4,nrow = 2,byrow = TRUE)
    > x
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    > x+10:13
         [,1] [,2]
    [1,]   11   14
    [2,]   14   17
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    矩阵元素筛选

    > x<-matrix(c(1:3,2:4),nrow=3)
    > x
         [,1] [,2]
    [1,]    1    2
    [2,]    2    3
    [3,]    3    4
    > x[x[,2]>=3,]
         [,1] [,2]
    [1,]    2    3
    [2,]    3    4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Step 1:

    > j<-x[,2]>=3
    > j
    [1] FALSE  TRUE  TRUE
    
    • 1
    • 2
    • 3

    Step 2:

    x[j,]
    
    • 1

    说明:

    • x[,2]是向量
    • >=用于比较两个向量
    • 数值3被自动重复,变成一个长度为3的向量

    简单来说就是选择第2列大于等于3的行

    🎇筛选规则可以基于被筛选变量之外的变量

    > z<-c(5,12,13)
    > x
         [,1] [,2]
    [1,]    1    2
    [2,]    2    3
    [3,]    3    4
    > x[z%%2==1,]
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    z%%2==1,返回一个逻辑向量 TRUE FALSE TRUE,x[z%%2==1,]选取对应的行,即第2行、第3行。

    🎇筛选规则基于复杂的逻辑运算

    > m<-matrix(1:6,nrow=3)
    > m
         [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
    > m[m[,1]>1 & m[,2]>5,]
    [1] 3 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    说明:& 是向量的逻辑“与”,&&是标量的逻辑“与”

    m[,1]>1 选取第1列大于1的行,符合要求的有2、3行

    m[,2]>5 选取第2列大于5的行,符合要求的只有第3行

    又使用了与运算符,选择同时满足两个条件的第3行,最后返回第3行的元素

    which函数在矩阵中的应用

    > m<-matrix(c(5,2,9,-1,10,11),nrow=3)
    > m
         [,1] [,2]
    [1,]    5   -1
    [2,]    2   10
    [3,]    9   11
    > which(m>2)
    [1] 1 3 5 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    which返回的是条件表达式为真的元素所在的位置值

    n<-c(1:5)
    p<-which(n %in% m)#返回的是n中符合元素的下标
    [1] 2 5
    
    
    • 1
    • 2
    • 3
    • 4

    n中的第2个和第5个元素在m中

    > x <-matrix(1:4,nrow = 2,byrow = TRUE)
    > x
         [,1] [,2]
    [1,]    1    2
    [2,]    3    4
    > x+10:13
         [,1] [,2]
    [1,]   11   14
    [2,]   14   17
    > m<-matrix(c(5,2,9,-1,10,11),nrow=3)
    > m
         [,1] [,2]
    [1,]    5   -1
    [2,]    2   10
    [3,]    9   11
    > which.max(m)#取矩阵m最大值下标
    [1] 6
    > which.min(m)#取矩阵m最小值下标
    [1] 4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    R语言中的%in%运算符

    判断前面一个向量内的元素是否在后面一个向量中,返回布尔值。

    > a <-trunc(runif(10,1,20))
    > a
     [1] 14  4 10  5 13 11  3 12  2  8
    > b <-1:10
    > a %in% b
     [1] FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    提取a在b中出现的元素

    > a[a %in% b]
    [1]  4 10  5  3  2  8
    
    • 1
    • 2

    提取a没有在b中出现的元素

    > a[!(a%in%b)]
    > [1] 14 13 11 12
    
    • 1
    • 2
    > score<-c(80,90,70,65,87,97,56,78,92)
    > score<-matrix(score,3,3)
    > score
         [,1] [,2] [,3]
    [1,]   80   65   56
    [2,]   90   87   78
    [3,]   70   97   92
    
    > rnames<-c("Linda","James","John")
    > cnames<-c("Eng","Math","R")
    > dimnames(score)<-list(rnames,cnames)
    > score
               Eng   Math     R
    LInda    80     65       56
    James   90    87        78
    John      70    97       92
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    对矩阵的行和列调用函数

    *apply()函数系列是R中最受欢迎同时也是最常用的函数族,包括apply(), tapply(), 和lapply()。

    apply()功能:

    Retruns a vector or array or list of values obtained by applying a function to margins of an array or matrix.

    apply()一般形式:

    apply(x,dimcode,f,fargs)

    说明:

    • x是一个矩阵
    • dimcode是维度编号,取值为1代表对每一行应用函数,取值为2代表对每一列应用函数,取值为c(1,2)对行和列都进行操作
    • f是应用在行或列上的函数
    • fargs是f的可选参数集

    apply()函数

    > m<-matrix(1:6,nrow=3)
    > m
         [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
    > apply(m,2,mean)
    [1] 2 5
    
    > apply(m,2,function(x) mean(x)+2)
    [1] 4 7
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    避免意外降维

    > x<-matrix(1:8,nrow=4)
    > x
         [,1] [,2]
    [1,]    1    5
    [2,]    2    6
    [3,]    3    7
    [4,]    4    8
    > r<-x[2,]
    > r
    [1] 2 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    验证r是向量的方法

    方法1:

    > is.vector(r)
    [1] TRUE
    
    • 1
    • 2

    方法2:

    > attributes(x)
    $dim
    [1] 4 2
    > attributes(r)
    NULL
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方法3:

    > str(x)
     int [1:4, 1:2] 1 2 3 4 5 6 7 8
    > str(r)
     int [1:2] 2 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以加上drop=FALSE,避免降维

    > r<-x[2,,drop=FALSE]
    > str(r)
     int [1, 1:2] 2 6
    
    
    • 1
    • 2
    • 3
    • 4

    (x) mean(x)+2)
    [1] 4 7

    
    ## 避免意外降维
    
    ```R
    > x<-matrix(1:8,nrow=4)
    > x
         [,1] [,2]
    [1,]    1    5
    [2,]    2    6
    [3,]    3    7
    [4,]    4    8
    > r<-x[2,]
    > r
    [1] 2 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    验证r是向量的方法

    方法1:

    > is.vector(r)
    [1] TRUE
    
    • 1
    • 2

    方法2:

    > attributes(x)
    $dim
    [1] 4 2
    > attributes(r)
    NULL
    
    • 1
    • 2
    • 3
    • 4
    • 5

    方法3:

    > str(x)
     int [1:4, 1:2] 1 2 3 4 5 6 7 8
    > str(r)
     int [1:2] 2 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以加上drop=FALSE,避免降维

    > r<-x[2,,drop=FALSE]
    > str(r)
     int [1, 1:2] 2 6
    
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    linux系统 常用命令(全面总结)
    Java api中文在线版
    最小生成树学习笔记
    Leetcode Practice -- 数组
    剑指offer 18. 正则表达式匹配
    第六篇、静态代理模式与Lamda表达式
    JVM 类的加载篇
    复制交易为什么用经纪商信号?anzo capital昂首资本3点理由心服口服
    如何选择跨平台桌面应用开发框架
    [每周一更]-(第73期):介绍容器监控工具-CAdvisor
  • 原文地址:https://blog.csdn.net/W_chuanqi/article/details/127699620