矩阵
创建矩阵
matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=list(rownames,colnames))
byrow
:是否按行取数据,默认为不按行
dimnames
:各行各列的名称
ps:
如果创建的是矩阵,nrow(A)
和NROW(A)
以及ncol(A)
和NCOL(A)
表示的都是行数和列数;
但如果创建的是向量,nrow(A)
和ncol(A)
返回的是NULL,而NROW(A)
和NCOL(A)
返回的则是列数和1,因为向量当作了列向量来看。
> matrix(1:12,ncol=4)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> matrix(1:12,nrow=3,byrow=T) #按行取数据
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> data <- sample(55:100,12,replace=T)#随机抽样
> score <- matrix(data,nrow=3,
+ dimnames=list(c("张三","李四","赵二"),
+ c("数学","语文","英语","科学")))
>
> score
数学 语文 英语 科学
张三 58 75 84 91
李四 95 85 73 94
赵二 84 64 88 94
使用rowname还有colname可获取对应的行名列名,并进行整体修改或者单独修改
> rownames(A) #NULL
NULL
> rownames(score) #获取行的名字
[1] "张三" "李四" "赵二"
> colnames(score) #获取列的名字
[1] "数学" "语文" "英语" "科学"
==============================
> rownames(score) <- c("Tony","Lisa","Mary")
> rownames(score)[3] <- "John"
> score
Math Chinese English Science
Tony 58 75 84 91
Lisa 95 85 73 94
John 84 64 88 94
矩阵索引
矩阵是二维的,通过索引A[i,j]
查询第i行第j列,注意不是i+1和j+1
索引方法:
- 可以通过整数索引【负整数表示去掉这一行(列),比如-2表示去掉第二行(列)】;
- 可以通过字符串索引:
A["Mary", "语文"]
- 可以通过向量索引:
A[c(1,2,3)]
选取第1,2,3行 - 可以通过逻辑索引:
A[c(T,F,T)]
选取逻辑值为T的行 - 可以直接根据行名、列名选择:
A[c('Tony','John')]
,A[,c('Math','English')]
> s[3,2] #第3行第2列
[1] 100
> s[c(F,F,T,F,F), c(F,T,F,F)] #逻辑向量
[1] 100
> s["Mary", "语文"] #字符串向量
[1] 100
> s[c("Tony","John"),]
数学 语文 英语 政治
Tony 71 94 64 90
John 83 73 82 84
> s[,"英语"]
Tony Lisa Mary John Adam
64 96 59 82 94
选出其中一行或者某一列避免降维【变成向量】的方法:
A[2,,drop=F]
> fruit
Q1 Q2 Q3 Q4
Apple 22 25 25 31
Orange 32 31 22 28
Banana 40 40 39 38
> class(fruit) #matrix
[1] "matrix"
> x <- fruit[2,]
> class(x) #integer 从矩阵降维成向量了
[1] "integer"
> x
Q1 Q2 Q3 Q4
32 31 22 28
> y <- fruit[2,,drop=F] #避免降维
> y
Q1 Q2 Q3 Q4
Orange 32 31 22 28
利用逻辑行向量选择满足特定条件的行或者列:
> #第二季度销量大于30的水果的全年销售情况
> fruit[fruit[,2]>30,,drop=F]
Q1 Q2 Q3 Q4
Orange 32 31 22 28
Banana 40 40 39 38
矩阵的转置
> A <- matrix(1:12, nrow=3)
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> B<-t(A) #矩阵转置
> B
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4