R语言系列8 | 变量类型7-矩阵的创建修改和索引

矩阵是可以看作一种特殊的向量的,它比向量多了两个附加属性,行数和列数,因此让它的复杂程度获得了提高。

向量作为R中的一种非常基础的数据类型,大家通过过去的学习一定已经彻底的掌握了。但是,这个世界上的数据是复杂多变的,我们只使用向量是无法表示更加复杂的数据情况。

我们在线性代数课上学过一种数学概念,矩阵。这个概念在为了统计学家开发的R语言中同样适用,并且只需要在基础环境中,我们可以具有很多对矩阵的操作方法。

(由于R其实处理数据框较多,矩阵并不会讲很多的东西,如果非要使用矩阵,我其实还是更推荐去隔壁Python学习np和scipy)

创建矩阵

任何数据类型学习的开始都是如何得到它,也就是如何创建它。矩阵也不例外,我们首要的创建方式就是直接使用matrix函数进行创建。而且其实说是创建矩阵,我们其实是在把一个向量转化为矩阵,

# 创建矩阵
m1 <- matrix(1:9,
             nrow = 3,
             ncol = 3)
 m1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

上面就是最基本的创建矩阵的方法了。我们需要给matrix一个向量(其实矩阵也可以,不过就会让你产生一些奇奇怪怪的误导,后面讲解了矩阵转向量的时候你就明白了),这个向量的内容就会成为创建的矩阵的内容。

然后跟着需要指定你想创建的行数或者列数,这两个只需要指定其一即可,R会给我们计算另一个数字是几的,这样,我们就创建好了一个矩阵。

但是我们可以发现一个问题,我们创建的矩阵是竖着一排排放的,这个叫做,****列优先原则,我们也可以通过指定参数byrow,来让矩阵变成行优先

> m11 <- matrix(1:9,
+               nrow = 3,
+               byrow = T)
> m11
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
>

这就是行优先矩阵了,存储的内容都是一样的,就是行列优先顺序不同。

到这里你可能就会问了,R是不是只能创建方阵呢,普通的矩阵能不能创建呢?那当然可以了


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

我本人是习惯列优先进行存储的,所以我一般不指定byrow参数。

矩阵的索引

任何一种数据类型,我们对它最优先的操作学习,都是索引操作。任何一种结构的数据,我们存储它的目的都是为了使用,所以学习如果取到它的值,是非常重要的事情。

对矩阵的基本索引方式和向量非常相似,如果不了解向量的直接索引,布尔索引和连续索引,请看

向量的索引方式

onlybugs,公众号:轻松玩转生信R语言系列2 | 变量类型1-向量1

由于有了上面的基础,所以我们先索引点简单的,然后做两个不一样的案例。矩阵和向量最大的区别再与矩阵具有两个维度,索引的时候需要两个位置

# 最简单的索引方法 取位置 1 1
> m1[1,1]
[1] 1
# 取第一行和第二行的第三列的值
> m1[c(1,2),3]
[1] 7 8
# 取第一行的所有列
> m1[1,]
[1] 1 4 7

这里停一下,我们取第一行的所有列就已经是不同了,要注意,当我们想取某一行的所有列,或者某列的所有行,或者当你想取所有的时候,把位置空出来,R就会自动给你取到所有。

说完了上面的,下面就都非常简单了

#  取一二行的所有列
> m1[c(1,2),]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
# 取第一行和第三行的所有列
> m1[c(T,F,T),]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    3    6    9
# 取前两行和后两列位置的值
> m1[c(T,T,F),c(2,3)]
     [,1] [,2]
[1,]    4    7
[2,]    5    8

大家尤其要注意最后一种,取前两行和后两列的操作,很多时候这是非常有用的步骤,会减少你使用循环,提高程序的运行速度。

改变矩阵的行和列

讲解完了索引,我们来讲一下如何矩阵的内容以及删除矩阵的行列。

其实修改特定位置的值非常简单,我们都已经找到了,修改就是一瞬间的事情,


> m1[1,1] = 11
> m1
     [,1] [,2] [,3]
[1,]   11    4    7
[2,]    2    5    8
[3,]    3    6    9

除了单个值的修改,我们还可以对索引到的行和列进行修改,一般来说,我们会直接把要修改的结果放进向量中,然后进行修改,但是如果修改的值不够长,也是可以操作的,如下


> m1[1,] = 1
> m1
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    5    8
[3,]    3    6    9

如果你对上面的内容表示有些困惑,那么你应该回忆一下,

循环补齐机制

onlybugs,公众号:轻松玩转生信R语言系列3 | 变量类型2-向量2

这里有着你需要了解的一切。

最后讲解如何删除矩阵的行列,这里的操作也和向量是一样的,具体请回顾

向量的增删改

onlybugs,公众号:轻松玩转生信R语言系列2 | 变量类型1-向量1


> m1[-1,]
     [,1] [,2] [,3]
[1,]    2    5    8
[2,]    3    6    9
> m1[,-3]
     [,1] [,2]
[1,]    1    1
[2,]    2    5
[3,]    3    6

本文的全部内容就到此结束了,这篇文章讲解了最最基本的矩阵创建方法,以及对矩阵进行索引的操作,加上修改矩阵元素和删除矩阵的列等等,这些都是使用矩阵的基础知识,需要彻底掌握,才能在矩阵的使用中得心应手。

下一篇文章将会介绍矩阵维度,矩阵转化为向量以及矩阵的各种运算,矩阵的转置等内容。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “ 如果说编程是盖一栋大楼,那么说,变量就是这栋大楼的各种建筑材料。想盖好大楼,我们就应该理解每种材料的特性以及使...
    onlybugs阅读 704评论 0 1
  • “ 终于迎来了向量的终章,到这篇文章末为止,大部分代码里的向量操作都难不倒你了,和数据生成以及索引等的操作也都再不...
    onlybugs阅读 571评论 0 0
  • “ 上节课我们讲解了向量的基本运算和R语言中非常重要的概念,循环补齐机制,但是我们还不能很方便的创建特定样式的向量...
    onlybugs阅读 546评论 0 0
  • “ 对于向量来说,除了对它进行创建和增删改查操作,我们还有很多魔法一样的操作来处理向量。” 首先给出上一篇文章末尾...
    onlybugs阅读 469评论 0 1
  • “ 在拿到一组数据的时候,我们经常会对特定的值进行筛选,或者想看看数据中是不是有NA值以及排查数据是不是都大于或者...
    onlybugs阅读 534评论 0 0