第四章 向量、矩阵和数组

本文介绍了R语言中向量的创建、访问、运算及特殊函数,如`c()`,`seq()`,`rep()`等。同时讲解了矩阵和数组的创建、索引、运算及转置,包括`matrix()`和`array()`函数的使用。内容涵盖了向量的命名、循环重复以及行列处理等核心概念。
摘要由CSDN通过智能技术生成

一二章介绍了几种向量类型逻辑向量、字符型向量、数字向量
本章将介绍更多向量的操作方法以及塔恩的多维兄弟矩阵和向量

向量框 数组(矩阵),列表,数据框
1.创建 c vector
2.访问:索引,切片x[5],x[1:5],x[-2],x[T,F,F],x[‘apple’]
3.运算±*/
4.方法seq length
5.特殊函数rep

第三章 向量、矩阵和数组

4.1.1向量
冒号运算符用来创建从某个书到另一个数的数字序列,以及用C函数拼接数值和向量,以及创建更长的向量

8.5:4.5
#8.5:4.8#最后一个并一定取得到,要看公差
c(1,1:3,c(56,9),1)#不同值拼接成单一向量
8.57.56.55.54.5
11235691

创建(vector):创建一个指定类型和长度的矢量,其结果的值可以是0、FALSE、空字符串或者任何相当于“什么都没有”的类型

vector('numeric',5)
vector('complex',5)
vector('logical',5)
vector('character',5)
vector('list',5)
00000
0+0i0+0i0+0i0+0i0+0i
FALSEFALSEFALSEFALSEFALSE
''''''''''
NULL
NULL
NULL
NULL
NULL

#和上文一样使用每个类型的包装(WRAPPER)函数来创建矢量来节省打字时间

numeric(5)
complex(5)
logical(5)
character(5)
#list有所不同,后文介绍
00000
0+0i0+0i0+0i0+0i0+0i
FALSEFALSEFALSEFALSEFALSE
''''''''''
x<-c()
for(i in 1:10){
    x<-c(x,i^2)
} 
x#会涉及内存的移动 速度慢 效率低 寻找新的位置以便放得下全部的数据
149162536496481100
x<-vector('numeric',10)#初始化效率
for(i in 1:10){
    x[i]<-i^2
} 
x#先找了能存的下数据的位置空间 先初始化为零 不会涉及内存的移动 这就是使用vector()函数的原因
149162536496481100

4.1.2序列

除了:外还有其他函数可以创建更为通用的序列
seq能以许多方式指定序列,无需调用 有三个专门的函数满足使用
seq与:相比可以指定步长
seq_len函数将创建从1到置顶数的序列
seq_along函数可以输入从1开始、长度为其输入值的序列

#序列
seq.int(3,12)
seq(1,10,by=1.5)
seq(1,10,length.out=8)
seq(1,10,along.with =1:5)
seq.int(0.1,0.01,-0.01)
#?seq可以问是什么
3456789101112
12.545.578.510
12.285714285714293.571428571428574.857142857142866.142857142857147.428571428571438.7142857142857210
13.255.57.7510
0.10.090.080.070.060.050.040.030.020.01
#特例
n<-0
seq(n)#只有一个参数,默认为参数,起点默认为1
1:n
seq_len(n)
?seq
10
10

4.1.2长度

向量长度是非整数可以为0,缺失值也被计入长度 lenth()函数能查到这个值

#获取向量长度
length(1:5)
length(c(T,F,NA))
5
3
#定义字符串向量
sn<-c('sheena','leads','sheila','needs')
sn
#字符串向量长度与字符串长度
length(sn)
nchar(sn)
'sheena''leads''sheila''needs'
4
6565
#缩短向量长度,后面的值将会被删除
poincare<-c(1,0,0,0,2,0,2,0)
poincare
length(poincare)<-3
poincare
length(poincare)<-8
poincare#改后后面的值回不来 除非内存没占
10002020
100
100<NA><NA><NA><NA><NA>

4.1.3向量元素的命名
命名可以以忽略部分元素
创建向量
用names函数为元素添加名字
可以用names取得向量

c(apple=1,banana=2,'kiwi fruit'=3,7)
#等同于
x<-1:4
names(x)<-c('apple','banana','kiwi fruit','')
x
names(x)
names(1:4)
apple1banana2kiwi fruit347
apple1banana2kiwi fruit344
'apple''banana''kiwi fruit'''
NULL

4.1.4索引向量:访问向量中得部分或者个别元素
用[]实现,又称(子集,下标,切片)
正数:第一个数是1不是0
负数:会返回除了这个值绝对值位置的数
逻辑向量:返回TRUE的值
字符向量:命名的向量,返回该名字的切片

x<-(1:5)^2
x
x[c(1,3,5)]
x[c(-2,-4)]#表示去除 不是反过来
#等同于
x[c(T,F,T,F,T)]
#x[c(-2,4)] 该用法错误 不能正负值混用
1491625
1925
1925
1925
names(x)<-c('a','b','c','d','e')
x[c('b','d','a')]#不能混用
b4d16a1
#缺失索引得问题 返回的照样是缺失值(只可以用于正`在这里插入代码片`值和逻辑值)
#缺失值不可以用于负值索引会产生错误
x[c(1,NA,5)]
x[c(T,F,NA,F,T)]
a12<NA>e25
a12<NA>e25
#下标越界 不会产生错误 会返回缺失值
x[6]
NA: <NA>
#非整数索引 向零舍入
x<-1:10
x[1.9]
x[-1.9]
x[]#不返回任何下标将返回整个向量
1
2345678910
12345678910
#which函数
which(x>10)
which.min(x)
which.max(x)
x<-c(1:5)^2
x
which(x>10)
which.min(x)#等同于which(miin(x))
which.max(x)
1
10
1491625
45
1
5

4.1.5向量循环和重复
R语言会自动对参与运算得向量进行自动配对(重复短的向量)

#向量和每个值相加等同于每个元素和该数相加
1:5 +1
1+1:5
#不通畅的向量相加时,循环短的配合循环长的
1:5+1:15
#长的不是短的倍数时,警告后继续
1:5+1:7
23456
23456
246810791113151214161820
Warning message in 1:5 + 1:7:
“longer object length is not a multiple of shorter object length”
24681079
#rep函数 允许重复使用元素来创建矢量
#rep_len()返回长度
rep(1:5,3)
rep(1:5,each=3)
rep(1:5,times=1:5)
rep(1:5,length.out=7)
rep.int(1:5,3)
rep(1:5,13)

123451234512345
111222333444555
122333444455555
1234512
123451234512345
12345123451234512345123451234512345123451234512345123451234512345

4.2.1矩阵和数组

数组可以存放多维矩形数据
矩形是指每行每列都等长的二维数组

#array函数
three_d_array<-array(
1:24,
dim=c(4,3,2),
dimnames=list(c('one','two','three','four'),
             c('ein','zwei','drei'),
             c('un','deun')
             ))
print(three_d_array)
class(three_d_array)#数字的大小可以看到填充数据得方法和顺序 python可以看看numpy里的填充顺序
, , un
    ein zwei drei
one     1    5    9
two     2    6   10
three   3    7   11
four    4    8   12

, , deun

      ein zwei drei
one    13   17   21
two    14   18   22
three  15   19   23
four   16   20   24

'array'
#matrix函数
#创建矩阵不用像创建数组一样,指定维度dim参数
a_matrix<-matrix(1:12,
                 nrow=4,
                 dimnames=list(
                 c('one','two','three','four'),
                 c('ein','zwei','drei')
                ))
print(a_matrix)
class(a_matrix)



      ein zwei drei
one     1    5    9
two     2    6   10
three   3    7   11
four    4    8   12
'matrix''array'
#two_d_array
#矩阵也可以用array函数来创建
two_d_array<-array(1:12,
                  dim=c(4,3),
                  dimnames=list(
                   c('one','two','three','four'),
                   c('ein','zwei','drei')
                  ))
print(two_d_array)
class(two_d_array)#从数字大小排序可以看出传入的数是按列来填充
      ein zwei drei
one     1    5    9
two     2    6   10
three   3    7   11
four    4    8   12
'matrix''array'
#行与列的设定
matrix(1:12,
      nrow=4,
      byrow=T,#此时用byrow=TRUE来从行创建
      dimnames=list(
          c('one','two','three','four'),
          c('ein','zwei','drei')
      ))
A matrix: 4 × 3 of type int
ein	zwei	drei
one	1	2	3
two	4	5	6
three	7	8	9
four	10	11	12

4.2.2行(row),列(column)和维度

#dim函数:返回其维度的整数值向量
dim(three_d_array)
dim(a_matrix)
432
43
#nrow ,ncol函数:返回行数和列数
nrow(a_matrix)
ncol(a_matrix)
nrow(three_d_array)#也可用于数组,但仅限于第一维和第二维
ncol(three_d_array)
4
3
4
3
#数组长度:length()函数返回所有维度的乘积
length(three_d_array)
length(a_matrix)
24
12
#对dim得操作(不推荐):dim函数分配一个新的维度来重塑矩阵或数组 
#会删除原维度的名称
a_matrix
a_matrix_old<-a_matrix
dim(a_matrix)<-c(6,2)
a_matrix
a_matrix<-a_matrix_old
A matrix: 4 × 3 of type int
ein	zwei	drei
one	1	5	9
two	2	6	10
three	3	7	11
four	4	8	12
A matrix: 6 × 2 of type int
1	7
2	8
3	9
4	10
5	11
6	12
#NROW,NCOL:ncol、nrow、dim用于向量会返回NULL  
#只能用对应的NROW和NCOL,把他们当作单个列矩阵
identical(nrow(a_matrix),NROW(a_matrix))
identical(ncol(a_matrix),NCOL(a_matrix))
recaman<-c(0,1,3,6,2,7,13,20)
nrow(recaman)
NROW(recaman)#这个是8不是1
ncol(recaman)
NCOL(recaman)
TRUE
TRUE
NULL
8
NULL
1

4.2.3行名、列名和维度名

#行名、列名和维度名 返回的是
rownames(a_matrix)
colnames(a_matrix)
dimnames(a_matrix)

'one''two''three''four'
'ein''zwei''drei'
'one''two''three''four'
'ein''zwei''drei'

4.2.4索引数组
用[]表示
不同维度上用不同的方式指定索引的下标没问题
每个维度的下标用逗号隔开

#索引数组

a_matrix[1,c('zwei','drei')]#1行2、3列的两个元素

zwei5drei9

4.2.5合并矩阵

#合并矩阵
#c函数在拼接矩阵之前可以把它们转成向量
(another_matrix <-matrix(
seq.int(2,24,2),
nrow=4,
dimnames=list(
c('five','six','seven','eight'),
c('vier','funf','sechs')
)
))
c(a_matrix,another_matrix)
#通过使用cbind和rbind函数按行列来绑定两个矩阵,能跟自然的合并他们
cbind(a_matrix,another_matrix)
rbind(a_matrix,another_matrix)


A matrix: 4 × 3 of type dbl
vier	funf	sechs
five	2	10	18
six	4	12	20
seven	6	14	22
eight	8	16	24
12345678910111224681012141618202224
A matrix: 4 × 6 of type dbl
ein	zwei	drei	vier	funf	sechs
one	1	5	9	2	10	18
two	2	6	10	4	12	20
three	3	7	11	6	14	22
four	4	8	12	8	16	24
A matrix: 8 × 3 of type dbl
ein	zwei	drei
one	1	5	9
two	2	6	10
three	3	7	11
four	4	8	12
five	2	10	18
six	4	12	20
seven	6	14	22
eight	8	16	24

4.2.6数组算术
和向量一样加减乘除按照元素来处理矩阵和数组

#*:第一个矩阵的行数和第二个矩阵的列数相等
#数组运算
a_matrix +another_matrix
a_matrix * another_matrix
#执行算术运算要大小适当(一致性)(线性代数)
#+:大小相等    
#*:第一个矩阵的行数和第二个矩阵的列数相等
A matrix: 4 × 3 of type dbl
ein	zwei	drei
one	3	15	27
two	6	18	30
three	9	21	33
four	12	24	36
A matrix: 4 × 3 of type dbl
ein	zwei	drei
one	2	50	162
two	8	72	200
three	18	98	242
four	32	128	288
会抛出错误
#向量和数组相加
#向量的循环规则适用,唯独取决于数组
(another_matrix<-matrix(1:12,nrow=2))
a_matrix +another_matrix#会抛出错误
Error in parse(text = x, srcfile = src): <text>:3:1: unexpected input


2: #向量的循环规则适用,唯独取决于数组
3:^
Traceback:
#t运算:转置矩阵(不能转置高维)
t(a_matrix)
A matrix: 3 × 4 of type int
one	two	three	four
ein	1	2	3	4
zwei	5	6	7	8
drei	9	10	11	12
#内乘,外乘
#名称都存在的话 取第一个
a_matrix
a_matrix%*%t(a_matrix)
#一个行一个列
1:3%o%4:6
outer(1:3,4:6)
A matrix: 4 × 3 of type int
ein	zwei	drei
one	1	5	9
two	2	6	10
three	3	7	11
four	4	8	12
A matrix: 4 × 4 of type dbl
one	two	three	four
one	107	122	137	152
two	122	140	158	176
three	137	158	179	200
four	152	176	200	224
A matrix: 3 × 3 of type dbl
4	5	6
8	10	12
12	15	18
A matrix: 3 × 3 of type dbl
4	5	6
8	10	12
12	15	18
#逆矩阵
(m<-matrix(c(1,0,1,5,-3,1,2,4,7),nrow=3))
m^(-1)#不是
(inverse_of_m<-solve(m))#是逆矩阵
 m%*%inverse_of_m#验证一下
A matrix: 3 × 3 of type dbl
1	5	2
0	-3	4
1	1	7
A matrix: 3 × 3 of type dbl
1	0.2000000	0.5000000
Inf	-0.3333333	0.2500000
1	1.0000000	0.1428571
A matrix: 3 × 3 of type dbl
-25	-33	26
4	5	-4
3	4	-3
A matrix: 3 × 3 of type dbl
1	0	0
0	1	0
0	0	1
#行列式的值
B=matrix(1:9,nrow=3)
det(B)
0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值