除此之外还可以用append函数为原有的向量添加元素
> append(t,10:15)
[1] 2 543 3 5 1 10 11 12 13 14 15
Append 追加元素:
追加之后原来的向量并没有改变其元素取值;缺省关键字after时表示从向量的末尾追加元素
> c <- c(1,2,3,4)
> prod(c)
[1] 24
> append(c,6:8)
[1] 1 2 3 4 6 7 8
> append(c,9:12,after=3)
[1] 1 2 3 9 10 11 12 4
> prod(c)
[1] 24
向量下标运算:
R语言里向量下标从1开始;
例1:
创建一个向量,让其每个元素加4,求其第二个元素是几?
> (c(1,3,5,7)+4)[2]
[1] 7
例2:
元素替换
> t
[1] 2 543 3 5 1
> t[2] <- 10>
T
[1] 2 10 3 5 1
例3
> t
[1] 2 543 3 5 1
> t[c(1,3)] <- c(9,11)
> t
[1] 9 10 11 5 1
向量的逻辑运算:
> t
[1] 9 10 11 5 1
> t[t<4] #显示出t<4的数
[1] 1
> t[t>9]#显示出t>9的数
[1] 10 11
把向量中所有缺省值赋值为0
新建一个向量,其中包括缺省值
> x<-c(-1,2,5,6,NA)
> x
[1] -1 2 5 6 NA
> x[is.na(x)]<-0
> x
[1] -1 2 5 6 0
把向量中不是NA的值导入到另一个向量中去
> x<-c(-1,2,5,6,NA)
> x
[1] -1 2 5 6 NA
> u<-x[!is.na(x)]
> u
[1] -1 2 5 6
将变量s设为数值型,长度为向量X的长度,则s的默认元素都是0
> x
[1] -1 2 5 6 NA
> s<-numeric(length(x))
> s
[1] 0 0 0 0 0
分段函数的表示方法:
> y
[1] 1 3 5 7 9
> s<-numeric(length(y))
> s
[1] 0 0 0 0 0
> s[s<0] <- y[y<0]
> s[s>=0] <- y[y>=0] +1
> s
[1] 2 4 6 8 10
如果x是一个有缺失值的向量、则在对s赋值的时候会报错
> s<-numeric(length(x))
> s
[1] 0 0 0 0 0
> s[s<0] <- x[x<0]
> s[s>=0] <- x[x>=0] +1
Warning message:In s[s >= 0] <- x[x >= 0] + 1 :
number of items to replace is not a multiple of replacement length
向量1-5的元素不显示:
> x <- c(1:10)
> x
[1] 1 2 3 4 5 6 7 8 9 10
> x[-(1:5)]
[1] 6 7 8 9 10
R语言的矩阵
矩阵就是用数据排列成长和宽的表二维数组,单元必须是相同的数据类型;用列表示不同的变量,用行表示各个对象;R语言生成矩阵函数--matrix
语法:
Mymatrix <- matrix(vector,nrow=number_of_rows,ncol=number_of_columns,
Byrow=logical_value,dimnames=list(
Char_vector_rowames,char_vector_colnames))
第一个参数是数据;第二个参数是行数;第三个参数是列数;第四个参数表示:安行展开或者安列展开;第五个参数表示矩阵的维数;
> A <- matrix(1:12,nrow=3,ncol=4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> T(A)
Error: could not find function "T"
> t(A) #矩阵的转秩
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
> x <- 1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
> t(x)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
矩阵的简单运算
> A <- matrix(1:12,nrow=3,ncol=4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> t(A)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
> B<-A
> A+B
[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
> A-B
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
> 3*A
[,1] [,2] [,3] [,4]
[1,] 3 12 21 30
[2,] 6 15 24 33
[3,] 9 18 27 36
> B <- t(A)
> #两个矩阵相乘
> A%*%B
[,1] [,2] [,3]
[1,] 166 188 210
[2,] 188 214 240
[3,] 210 240 270
求矩阵的对角线元素:
> A <- matrix(1:16,nrow=4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> diag(A)
[1] 1 6 11 16
> diag(diag(A))
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
> diag(4) #生成对角元素值为1的单位矩阵
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
矩阵的求逆运算:solve()函数;
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> solve(A) #A不是可逆的矩阵
Error in solve.default(A) :
Lapack routine dgesv: system is exactly singular: U[3,3] = 0
#随机生成一个遵循正太分布的矩阵,避免它出现不可逆的情况,4X4的矩阵
A <- matrix(rnorm(16),4,4)
solve(A)
> A <- matrix(rnorm(16),4,4)
> A
[,1] [,2] [,3] [,4]
[1,] -0.70756823 -1.1234569 1.360924 -0.2375963
[2,] 1.97157201 -1.3441301 1.753795 -1.2241501
[3,] -0.08999868 -1.5231558 1.568365 -0.3278127
[4,] -0.01401725 -0.4219682 1.296756 -2.4124503
> solve(A)
[,1] [,2] [,3] [,4]
[1,] -0.05180593 0.4723860 -0.3259291 -0.1903122
[2,] 4.46734372 1.3701835 -5.0357807 -0.4509696
[3,] 4.70043705 1.4725733 -4.6045433 -0.5844802
[4,] 1.74551456 0.5491397 -1.5923475 -0.6487037
> solve(A)%*%A
#矩阵A和矩阵A的逆做运算应该是一个单位阵,由于计算机的计算误差出现了非对角元素趋向于0的误差
[,1] [,2] [,3] [,4]
[1,] 1.000000e+00 -1.151856e-15 1.137979e-15 -2.220446e-16
[2,] -5.238865e-16 1.000000e+00 1.665335e-15 -4.440892e-16
[3,] 2.255141e-17 -2.053913e-15 1.000000e+00 -2.220446e-16
[4,] -1.387779e-17 -2.220446e-16 -3.330669e-16 1.000000e+00
求特征值和特征向量:eigen()函数
> A
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
> (A.eigen <- eigen(A,symmetric = T))
$values #特征值就是:5,1,1,1
[1] 5 1 1 1
$vectors #特征向量
[,1] [,2] [,3] [,4]
[1,] -0.5 0.8660254 0.0000000 0.0000000
[2,] -0.5 -0.2886751 -0.5773503 -0.5773503
[3,] -0.5 -0.2886751 -0.2113249 0.7886751
[4,] -0.5 -0.2886751 0.7886751 -0.2113249
将矩阵变换为上三角矩阵:chol()函数
> A
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
> chol(A)
[,1] [,2] [,3] [,4]
[1,] 1.414214 0.7071068 0.7071068 0.7071068
[2,] 0.000000 1.2247449 0.4082483 0.4082483
[3,] 0.000000 0.0000000 1.1547005 0.2886751
[4,] 0.000000 0.0000000 0.0000000 1.1180340
> t(chol(A))%*%chol(A)
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
如果矩阵式对称的,就可以用chol()来求行列式的值以及举证的逆
dim(A)对矩阵A的维数;
nrow(A)矩阵A的行数;
ncol(A)矩阵A的列数;
rowSums(A)对行求和;
colSums(A)对列求和
colMeans()对矩阵的行和列求均值
> A
[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
> dim(A)
[1] 4 4
> nrow(A)
[1] 4
> ncol(A)
[1] 4
> rowSums(A)
[1] 5 5 5 5
> colSums(A)
[1] 5 5 5 5
方法一:矩阵的上三角矩阵和下三角矩阵:up.tri();low.tri();
> A<- matrix(1:16,4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> lower.tri(A)
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
> A[lower.tri(A)] <-0 #下三角矩阵
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 0 6 10 14
[3,] 0 0 11 15
[4,] 0 0 0 16
> A[up.tri(A)]
<- 0
Error in A[up.tri(A)] <- 0 : could not find function "up.tri"
> A[upper.tri(A)] <- 0 #上三角矩阵
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
> A<- matrix(1:16,4)
> A[upper.tri(A)] <- 0
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 2 6 0 0
[3,] 3 7 11 0
[4,] 4 8 12 16
> A[lower.tri(A)] =0
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
方法二:求矩阵的下三角阵和上三角阵
让行下标的位置小于列下表的位置的元素都为0,----下三角阵;
> A<- matrix(1:16,4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> row(A)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
> col(A)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 2 3 4
[3,] 1 2 3 4
[4,] 1 2 3 4
> A[row(A)<col(A)]=0
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 2 6 0 0
[3,] 3 7 11 0
[4,] 4 8 12 16
> A[row(A)>col(A)]=0
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
矩阵中计算行列式的值:det(A)
> A
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
> det(A)
[1] 1056
将矩阵转化为向量化算子(这里需要编写一个小函数)
> vec<-function(x){
+ t(t(as.vector(x)))
+ }
> A<-matrix(1:12,3,4)
> vec(A)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
[11,] 11
[12,] 12
根据矩阵的下标去取元素
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> A(2,3)
Error: could not find function "A"
> A[2,3]
[1] 8
> A[,3]
[1] 7 8 9
> A[2,]
[1] 2 5 8 11
> A[1:3,2] #取出1-3行的第二列元素
[1] 4 5 6