R语言学习丨矩阵和数组必学基础知识

今天笔记内容包含R语言中矩阵和数组基础知识。

R语言矩阵

创建矩阵

矩阵内可以是数字、符号、数学式,类似于常见的二维数组,有m行(row)n列(col)的矩阵m×n。

R 语言的矩阵可以使用 matrix() 函数来创建,语法格式如下:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL)

参数说明:

  • data 向量,矩阵的数据

  • nrow 行数

  • ncol 列数

  • byrow 逻辑值,为 FALSE 按列排列,为 TRUE 按行排列

  • dimname 设置行和列的名称,该参数用含有两个向量(字符串)的列表组成。

> # 按行排列创建矩阵
> zhen_1 = matrix(c(1:12),nrow = 3,byrow = TRUE)
> print(zhen_1)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
> # 定义行和列的名称
> rownames_1 = c("a1","a2","a3")
> colnames_2 = c("b1","b2","b3","b4")
> # 输出矩阵
> out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2))
> print(out_1)
   b1 b2 b3 b4
a1  1  2  3  4
a2  5  6  7  8
a3  9 10 11 12

转置矩阵

R 语言矩阵提供了t()函数,可以实现矩阵的行列互换,变化效果如下:


我们对刚刚创建的out_1矩阵进行转置后输出,如下:

> out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2))
> print(out_1)
   b1 b2 b3 b4
a1  1  2  3  4
a2  5  6  7  8
a3  9 10 11 12
> print(t(out_1))  #输出转置矩阵用t()
   a1 a2 a3
b1  1  5  9
b2  2  6 10
b3  3  7 11
b4  4  8 12

调用矩阵元素

可以元素的列索引和行索引,类似坐标形式,获取矩阵元素,如下:

> print(out_1) #获取整个矩阵
   b1 b2 b3 b4
a1  1  2  3  4
a2  5  6  7  8
a3  9 10 11 12
> print(out_1[1,2]) # 获取第1行第2列的元素
[1] 2
> print(out_1[2,]) # 获取第2行的元素
b1 b2 b3 b4 
 5  6  7  8 

矩阵的计算

大部分人已经学过线性代数,了解矩阵的加减乘除法则,值得注意的是只有行和列数都相同的矩阵才能加减运算,只有第一个矩阵的列数等于第二个矩阵的行数才能相乘。接下来进行演示:

> # 矩阵相加,相减只需把加号改成减号
> out_sum = m_1 + m_2  # 两个矩阵都是2×3
> cat("结果:","\n")
结果: 
> print(out_sum)
     [,1] [,2] [,3]
[1,]   14   -2    4
[2,]   18    8    6
> # 矩阵相乘
> out_cheng = m_1 * m_2  
> cat("结果:","\n")
结果: 
> print(out_cheng)
     [,1] [,2] [,3]
[1,]   49    1    4
[2,]   81   16    9
> # 矩阵相除
> out_chu = m_1 / m_2  
> cat("结果:","\n")
结果: 
> print(out_chu)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1

数组

R 语言可以创建一维或多维数组,数组是一个同一类型的集合,矩阵就是一个二维数组。


数组创建使用array()函数,该函数使用向量作为输入参数,可以使用 dim 设置数组维度。语法格式如下:

array(data = NA, dim = length(data), dimnames = NULL)

  • data 向量,数组元素。
  • dim 数组的维度,默认是一维数组。
  • dimnames 维度的名称,必须是个列表

例如创建一个3×3的二维数组,用于后续演示,方法如下:

> v1 = c(1,2,3)
> v2 = c(4,5,6,7,8,9)
> shuzu = array(c(v1,v2),dim = c(3,3,2))
> print(shuzu)
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
  • 设置各维度的名称
> column.names = c("col1","col2","col3")  #设置列名
> row.names = c("row1","row2","row3") #设置行名
> matrix.names = c("m1","m2") #设置矩阵名
> out_3 = array(c(v1,v2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names)) #设置数组名
> print(out_3) #输出
, , m1

     col1 col2 col3
row1    1    4    7
row2    2    5    8
row3    3    6    9

, , m2

     col1 col2 col3
row1    1    4    7
row2    2    5    8
row3    3    6    9
#上述m1和m2矩阵应用于笔记后面的演示,不再重复
  • 访问数组元素

数组的元素有坐标位置,索引顺序为(行,列,维度),例如[3,2,4]表示第4个矩阵第3行第2列的元素。

, , m2  #第二个矩阵

     col1 col2 col3
row1    1    4    7
row2    2    5    8
row3    3    6    9

> print(out_3[3,1,2])
[1] 3  #输出结果正确

  • 操作数组元素

可以通过访问矩阵的元素来访问数组,例如从数组中的一个矩阵创建新矩阵,然后进行矩阵加减运算,演示如下:

> matrix_1 = shuzu[,,1] 
> matrix_2 = shuzu[,,2]
> sum_1 = matrix_1 + matrix_2
> print(sum_1)
     [,1] [,2] [,3]
[1,]    2    8   14
[2,]    4   10   16
[3,]    6   12   18

apply()函数能够对数组跨纬度计算,语法格式为:apply(x, margin, fun)

  • x 数组
  • margin 数据名称(1代表行,2代表列,c(1,2)代表行和列)
  • fun 计算函数
> print(shuzu)  
, , 1   #数组的第一个矩阵
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2  #数组的第二个矩阵
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

> out_4 = apply(shuzu,1,sum)  #对数组所有矩阵按照每一行的方式求和
> print(out_4)
[1] 24 30 36  #第一行数据24=1+4+7+1+4+7,确实能行!
快速记忆:
# 计算数组中所有矩阵对应行的数字之和
result <- apply(shuzu, c(1), sum)
# 计算数组中所有矩阵对应列的数字之和
result <- apply(shuzu, c(2), sum)
# 计算数组中每个矩阵内部的所有数字之和
result <- apply(shuzu, c(3), sum)

参考资料:
https://www.runoob.com/r
公众号:生信分析笔记

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容