【R语言学习】004 向量、矩阵、数组
【R语言学习】 004 向量、矩阵、数组
最终梦想:将R当成一个绘图软件来使用
本章目标:能按照要求建立相应序列、矩阵、数组。
会用R进行矩阵运算
这章有点长,好学的同志一定能耐心看下去(我在努力让推文赶上老师进度)
一、向量
> vector("complex",5)
[1] 0+0i 0+0i 0+0i 0+0i 0+0i
> complex(5)
[1] 0+0i 0+0i 0+0i 0+0i 0+0i
> vector("logical",5)
[1] FALSE FALSE FALSE FALSE FALSE
> logical(5)
[1] FALSE FALSE FALSE FALSE FALSE
序列
(1)seq系列
eg:
> seq(1,5)
[1] 1 2 3 4 5
> seq(1:5)
[1] 1 2 3 4 5
> seq.int(1,5,2)
[1] 1 3 5
> seq_len(0)
integer(0)
> 1:0
[1] 1 0
> name<-c("chen01","wen02","tao03","chen04","zhuang05","han06")
> for(i in seq_along(name)) print (name[i])
[1] "chen01"
[1] "wen02"
[1] "tao03"
[1] "chen04"
[1] "zhuang05"
[1] "han06"
(2)中括号
直接看例子吧
> vector1 <- 1:10
> vector1 [-c(2,3,7)]
[1] 1 4 5 6 8 9 10
> vector2[2:10]
错误: 找不到对象'vector2'
2.长度
例子:
> string1 <- c("cwt","wct","wtzh","zhcwt")
> length(string1)
[1] 4
> nchar(string1)
[1] 3 3 4 5
3.命名
> cwt <- seq.int(1,5,length.out = 3)
> names(cwt)<-c("great","handsome","politely")
> cwt
great handsome politely
1 3 5
②直接在创建向量的时候命名
> czh<-c("nice"=1,"handsome"=2,"wise"=3)
> czh
nice handsome wise
1 2 3
4.索引
(1)下标
> x<-c(1:10)^3
> x
[1] 1 8 27 64 125 216 343 512 729 1000
> x[c(1,2,4)]
[1] 1 8 64
> x[c(-3,-5,-6,-7,-8,-9,-10)]
[1] 1 8 64
> x[c(TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)]
[1] 1 8 64
输入的下标为负数,表示这些位置上的不显示。
正负值不能混合使用,否则会出现错误。
(2)which函数
which函数将返回逻辑向量中为true的位置
这个很方便
例子:(还是用刚刚的x)
> which(x>10)
[1] 3 4 5 6 7 8 9 10
> which.min(x)
[1] 1
> which.max(x)
[1] 10
再次注意,which返回的是位置
5.循环与重复
一般教的比较着急的速成课程,会直接在讲完seq之后就开始讲rep。
先说循环:我在002当中有这样一个例子
这就是“循环”,那个warning message可以不管它
接下来看重复
说白了向量的重复就是一个rep函数的应用
rep函数简言之就是,rep(x,times=,length.out=,each,)
像seq函数那样,times之类的可以不写。times是x整体的重复次数,length.out表示结果截取前多少个元素显示,each则表示x中的单个元素重复多少遍。
例如:
> y<-seq.int(1,10,2)
> rep(y,2,7,2)
[1] 1 1 3 3 5 5 7
向量这节到此结束,请看下一节,矩阵和数组。
二、矩阵和数组
创建矩阵和数组
矩阵和数组可以理解成比向量壮很多倍的兄弟
我们此前见到的向量都是1维的,他们可以很长,但没有宽度(也就是维度)。这里的矩阵就是线性代数中的矩),是二维数组的特例。
可以使用array函数来创建一个数组。为他们传入两个向量(值和维度)作为参数,当然,我们也可以给每个维度起名字(例子中随便取的)。(这个例子看不懂可以继续往下看)
在英文中,
row 是横向的,排的意思
column 是纵向的,列的意思
《学习R》的译者是个大忽悠,把这两个翻译反了,,,(就这个睿智操作浪费我一个多小时时间检查演示代码)
例如:
> three_d_array <- array(1:24,
+ dim=c(4,3,2),
+ dimnames = list(c("one","two","three","four"),
+ c("handsome","tall","strong"),
+ c("jojo","dio")
+ )
+ )
> three_d_array
, , jojo
handsome tall strong
one 1 5 9
two 2 6 10
three 3 7 11
four 4 8 12
, , dio
handsome tall strong
one 13 17 21
two 14 18 22
three 15 19 23
four 16 20 24
dimnames指维度命名。如果把2,换成3,4,又会怎样?各位可以试试。
哪里有什么不够,循环多了就够了
——鲁迅
要注意的是,维度命名要和维度个数相匹配。
创建矩阵(matrix)的语法和上面非常类似,唯一不同的是,创建矩阵不需要传递地面参数,只要指定行数或列数即可(说白了只生成一张二维的表)。nrow用来指定列数。事实上当数据总数一定时,只用设定列数即可。
例如:(做一张本人的身高体重表)
> me<- matrix(c(54,63,67,158,183,189),
+ nrow=3,
+ dimnames = list(
+ c("2013","2016","2019"),
+ c("weight/kg","height/cm")
+ )
+ )
> me
weight/kg height/cm
2013 54 158
2016 63 183
2019 67 189
是不是很炫酷?
当然咯,我们可以用array来构建矩阵,说白了就是构建一个二维数组。如果不相信,可以自己构建一个,然后用identical函数检验,返回值一定是TRUE。这里就不演示了。不会用identical的可以看前面的002推文。
在尝试中,无需他人告诉,我们也能发现,在创建矩阵的时候传入的值按列填充矩阵。
也可以指定参数byrow=TRUE来填充,这样可以避免让一些null值或者NA混入其中。
2.行、列、维度
刚看到第一个例子的时候,可能会有点小蒙圈,特别是看到那行dim(4,3,2)的时候,不知道4,3,2分别对应什么。
如果仔细观察,可以发现:4,对应列;3,对应行;2,对应我们称为“表”的个数。
注解到此为止。
在这里我想先谈的是length函数。
问题:一个数组的length是什么?
答:length还是原来的length,即元素个数。那么这里,我们不难理解,length=所有维度之积。
其次,我们可以通过dim函数分配一个新的维度来重塑矩阵或数组。不过这里得小心翼翼,因为这样会删除原维度的名称。
当我们把nrow,ncol和dim应用于向量时,会返回NULL,
与之相对应的NROW和NCOL,则把向量当成矩阵来处理。例如:
> twc <- c(1,2,3,4,5)
> ncol(twc)
NULL
> NCOL(twc)
[1] 1
> nrow(twc)
NULL
> NROW(twc)
[1] 5
3.命名
这个还没啥好说的,dimnames、rownames、colnames,就是字面意思。
4.索引
这个,依然是下标问题。和向量一个道理。只不过要多考虑一个维度。
依然是用方括号表示索引。
而且还是老样子,四种索引方法(正整数,负整数,逻辑值,元素名)
要表示所有维度,只需要把相应的下标空出来(看行空列,看列空行)
具体看例子:这里因为我懒所以用上面已经输出的me矩阵(就是身高体重那个)
me[1,]
weight/kg height/cm
54 158
> #第一行的所有元素
5.合并矩阵
c函数能在拼接矩阵之前把它们转换成向量。
rbind,看字面可以明白就是“按行绑起来”,(按行合并)
cbind,“按列绑起来”(按列合并)
eg:这里依然用了之前的me矩阵,然后随便建了另一个莫名其妙的矩阵用来演示
> another_me <- matrix(
+ c(108,126,134,79,96,99),
+ nrow = 3,
+ dimnames=list(
+ c("3102","6102","9102"),
+ c("konodioda","theworld")
+ )
+ )
> c(another_me,me)
[1] 108 126 134 79 96 99 54 63 67 158 183 189
> cbind(another_me,me)
konodioda theworld weight/kg height/cm
3102 108 79 54 158
6102 126 96 63 183
9102 134 99 67 189
> rbind(another_me,me)
konodioda theworld
3102 108 79
6102 126 96
9102 134 99
2013 54 158
2016 63 183
2019 67 189
6.矩阵运算
和向量运算类似,标准运算符(+-*/)对矩阵和数组同样适用,运算法则同线性代数。
特别注意,当对两个数组进行算数运算时,一些特定维度必须相等。
例如:矩阵相乘时前一个的行数要等于后一个的列数,两个数组相加时各个维度都要相等。如果连线性代数的运算规则都遵守不了,计算机是不会帮你算高代作业的。
t函数用来转置矩阵,但不能转置2维以上的数组
矩阵的內积与外积
内积用特殊运算符%*%计算;外积用特殊运算符%o%计算
每一次,若维度的名称存在,则取第一个输入。
求逆矩阵:用solve函数而不是用-1次幂。
本章内容到此为止。
本章作业代码:(题目见下方照片)
注 练习4-2应是生成23*23的矩阵
#excercise 4-1
> num<-c(1:20)
> thenumber <- num*(num+1)/2
> names(thenumber) <- c(letters[1:20])
> thenumber
a b c d e f g h i j k l m n
1 3 6 10 15 21 28 36 45 55 66 78 91 105
o p q r s t
120 136 153 171 190 210 ##这里是输出的
> thenumber[c("a","e","i","o")]
a e i o
1 15 45 120 ##这里是输出的
#excercise 4—2
sequ001<-11:1
sequ002<-0:11
x <- c(sequ001,sequ002)
diag(x)
##还有一种方法:
diag(abs(seq.int(-11,11)))
##输出结果不在这里显示因为太大了
##excercise 4-3
square21 <- diag(1,ncol=21,nrow = 20)
square21
line0<-matrix(rep(0,1),1,ncol =21)
m<-rbind(line0,square21)
m
o <- rbind(square21,line0)
n <- diag(abs(seq.int(-10,10)))
p <- m+o
p+n
eigen((p+n))
特点:大部分特征值特征向量都相等
后来在csdn查了一下发现还真的只有这个不算特点的特点。。。
本期到这里结束
看在我全部手打的份上
还有琴吹紬的份上
点个关注点个在看吧
欢迎关注淏泧三千
这是一个让作者放弃王者、崩坏3、方舟、fgo、万象