|
1、向量:向量是由一系列类型相同的有序元素构成:
1.1简单的数值输入,就像数学中的表达式一样,对数值进行加减乘除、取余等数学运算,结果都为一维向量。
R中所有输入的数值都会被认为是向量,向量是一组有序数字的集合。“[1]”表示在这一行中出现的第一个元素的下标是1。
(1+2)/3*8
[1] 8
1.2 C(…)函数,并且此时向量具有以下功能。
1)循环补齐:在一定的情况下自动延长向量;
c(1,2,3,4,5,6)+c(2,3,4,7)
[1] 3 5 7 11 7 9
c(89,2,3,7,5)/c(10,100)
[1] 8.90 0.02 0.30 0.07 0.50
c(1,2,3,4,5)+88
[1] 89 90 91 92 93
2)筛选:提取向量子集;[]一般在对对象中的元素进行提取;()一般跟在函数后面使用。
1.2.1通过元素的位置索引对元素进行提取
x<- c(89,2,3,7,5,45)
> x[1] %对某一个元素的提取。
[1] 89
> x[c(1,6)] %对多个元素进行提取,将它们的位置以向量形式表达。
[1] 89 45
1.2.2通过条件对元素进行提取
x[x>40] %对满足条件的元素进行提取,在该例子中取出大于40的数。
[1] 89 45
x[x%%2==0] %同上,取出偶数。
[1] 2
x<- c(89,2,3,7,5,45)
> x[c(-1,-3)] %删除某个元素,对位置的删除即可。
[1] 2 7 5 45
3)向量化:对向量的每一个元素应用函数。
x<-c(12,1,34,57,3)
> x*x
[1] 144 1 1156 3249 9
x/2
[1] 6.0 0.5 17.0 28.5 1.5
y<-c(10,20,30,40,100)
> log10(y)
[1] 1.000000 1.301030 1.477121 1.602060 2.000000
x<-runif(10,0,1)
> x
[1] 0.8292396 0.9919873 0.4362093 0.5512642 0.8074693 0.2900539 0.9523186 0.9239594
[9] 0.4272226 0.7242515
> sin(x)
[1] 0.7374180 0.8371148 0.4225067 0.5237645 0.7225400 0.2860039 0.8147620 0.7979941
[9] 0.4143446 0.6625750
2矩阵:矩阵是数组(array)的一个特例:维数为2的数组;而数组又是增加了维度(dim)属性的向量。
引:创建矩阵(matrix)
matrix(矩阵里面要输出的数据(有n*m个数据),nrow= n ,ncol=m ,byrow=T)其中画下划线的可以省略。其中的数据一般默认(省略byrow=T)按列存储,若想要数据按着行开始排列,可以通过加上byrow=T实现。
x<-matrix(11:20,2,5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 11 13 15 17 19
[2,] 12 14 16 18 20
y<-matrix(11:20,2,5,byrow=T)
> y
[,1] [,2] [,3] [,4] [,5]
[1,] 11 12 13 14 15
[2,] 16 17 18 19 20
> dim(y) %用dim()函数得到矩阵的行列数
[1] 2 5
> str(y) %用str()函数不仅可以得到矩阵的行列数,同时也可得到矩阵里面的内容。
int [1:2, 1:5] 11 16 12 17 13 18 14 19 15 20
2.1.1矩阵的乘法(x%*%y)。要求:前后两个矩阵相乘时,x的列数应与y的行数相等,即一个m*n的矩阵x与n*p的矩阵y相乘即可得到m*p的矩阵。
x<-rnorm(6,2,3) %产生6个随机数,并且服从N(2,3)。
> x
[1] 4.0036570 -0.9122573 -1.3968625 1.7781212 1.8206276 5.4505580
X<-matrix(x,2,3) %创建一个2行3列的矩阵。
X
[,1] [,2] [,3]
[1,] 4.0036570 -1.396862 1.820628
[2,] -0.9122573 1.778121 5.450558
y<-matrix(1:9,3) %创建一个3行3列的矩阵。
> y
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> X%*%y %结果将出现2行3列的矩阵。
[,1] [,2] [,3]
[1,] 6.671815 19.95408 33.23635
[2,] 18.995659 37.94492 56.89419
2.1.2矩阵与数的简单运算
y/100
[,1] [,2] [,3]
[1,] 0.01 0.04 0.07
[2,] 0.02 0.05 0.08
[3,] 0.03 0.06 0.09
矩阵中的每个元素都将运行该算法。
y/c(10,100)
[,1] [,2] [,3]
[1,] 0.10 0.04 0.70
[2,] 0.02 0.50 0.08
[3,] 0.30 0.06 0.90
此时,向量扔具有循环补齐的作用。
2.2矩阵的特征值、特征向量、协方差、相关系数矩阵、矩阵数据的标准化。该过程可应用于主成分分析和因子分析中。
y<-matrix(1:9,3) %创建一个3阶方阵
> y
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> y_standard<-scale(y) %矩阵y里面的数据标准化。
> y_standard
[,1] [,2] [,3]
[1,] -1 -1 -1
[2,] 0 0 0
[3,] 1 1 1
attr(,"scaled:center")
[1] 2 5 8
attr(,"scaled:scale")
[1] 1 1 1
> y_cov<-cov(y) %求矩阵y的协方差矩阵。
> y_cov
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 1
> y_eig<-eigen(y) %求矩阵y的特征值和特征向量。
> y_eig
$values
[1] 1.611684e+01 -1.116844e+00 -4.054214e-16
$vectors
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483
补充:
class(y_eig)
[1] "list" 由结果可知y_eig的数据类型属于列表。
y_eig$vectors %对列表的标签进行索引提取内容。
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483
class(y_eig$vectors)
[1] "matrix"
y_eig[[2]]
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483
> class(y_eig[[2]])
[1] "matrix"
由上面两个结果对比可知,两个的内容一样,连数据类型也是一样。
y_eig$vectors 与y_eig[[2]]等价。
> y_eig[2] %队列表的位置索引提取内容。
$vectors
[,1] [,2] [,3]
[1,] -0.4645473 -0.8829060 0.4082483
[2,] -0.5707955 -0.2395204 -0.8164966
[3,] -0.6770438 0.4038651 0.4082483
> class(y_eig[2])
[1] "list" 可知对位置索引后仍为列表。
2.3矩阵的索引、提取、删除、增加行列数。
x<-matrix(c(11,22,33,44,55,66,77,88,99,1,2,3),3,4)
> x
[,1] [,2] [,3] [,4]
[1,] 11 44 77 1
[2,] 22 55 88 2
[3,] 33 66 99 3
> x[,c(1,4)] %提取矩阵x的第一列和第四列。
[,1] [,2]
[1,] 11 1
[2,] 22 2
[3,] 33 3
> x[c(2,3),] %提取矩阵x的的第二行和第三行。
[,1] [,2] [,3] [,4]
[1,] 22 55 88 2
[2,] 33 66 99 3
> x[-1,-2] %删除第一行和第二列之后提取。
[,1] [,2] [,3]
[1,] 22 88 2
[2,] 33 99 3
rbind(x,c(8,9,4,3)) %增加一行,最好与原来行数的数目相等。
[,1] [,2] [,3] [,4]
[1,] 11 44 77 1
[2,] 22 55 88 2
[3,] 33 66 99 3
[4,] 8 9 4 3
> cbind(x,c(9,23,4)) %增加一列,最好与原来列数的数目相等。
[,1] [,2] [,3] [,4] [,5]
[1,] 11 44 77 1 9
[2,] 22 55 88 2 23
[3,] 33 66 99 3 4
2.4单独对矩阵的行列进行处理。(apply(x,n,f)n取1的时候对行进行f法则运算,取2的时候对列进行f法则运算)
x<-matrix(c(11,22,33,44,55,66,77,88,99,1,2,3),3,4)
> x
[,1] [,2] [,3] [,4]
[1,] 11 44 77 1
[2,] 22 55 88 2
[3,] 33 66 99 3
> apply(x,1,mean) %求出每行的均值。
[1] 33.25 41.75 50.25
rm(list=ls())
> x<-matrix(c(11,22,33,44,55,66,77,88,99,1,2,3),3,4)
> f<-function(x) x+c(1,2,3,4) %对每行的数依次加上1,2,3,4。若此时个数与原来矩阵x的列数不相等,会进行循环补齐。
> apply(x,1,f)
[,1] [,2] [,3]
[1,] 12 23 34
[2,] 46 57 68
[3,] 80 91 102
[4,] 5 6 7
apply(x,2,sum) %对每列的数进行求和运算。
[1] 66 165 264 6
3.数据框: 列表(list)和数据框(data frame)分别是向量和矩阵的泛化——列表允许包含不同类型的元素,甚至可以把对象作为元素;数据框允许每列使用不同类型的元素。对于列表和数据框,其中的元素通常称为分量(components)。(此时的数据框在生活中可以见到很多。例如大学对学生的调查,可能就包括学生学号、班级、性别、各科目成绩,进而对学生进行全面的分析。或者是居民的生活水平进行调查,数据就包括性别、工作单位、工资、生活支出等各种不同类型的数据)
3.1创建一个数据框:data.frame(data1, data2, ...)
name <- c('Mr A', 'Mr B', 'Mr C'); group <- rep(1, 3); score <- c(69, 71, 92)
> dd <- data.frame(name, group, score)
>
> dd
name group score
1 Mr A 1 69
2 Mr B 1 71
3 Mr C 1 92
class(dd)
[1] "data.frame" 由结果可知此时dd数据集存储类型为数据框。
3.2数据框内数据的提取
dd[[3]]
[1] 69 71 92
> class( dd[[3]]) %对数据框里的第三组里面的具体内容。
[1] "numeric"
dd$score
[1] 69 71 92
> class(dd$score) %对数据框下标签为score下的数据进行提取。
[1] "numeric" 由上面两个结果可知,结果和数据类型一致。
dd[3]
score
1 69
2 71
3 92
class(dd[3]) %提取数据框里面的第三组。
[1] "data.frame"
3.3合并数据框
name <- c('Mr A', 'Mr B', 'Mr C'); group <- rep(1, 3); score <- c(69, 71, 92)
> dd <- data.frame(name, group, score)
> shuxue<-c(80,87,90)
dd1<-cbind(dd,shuxue) %
> dd1
name group score shuxue
1 Mr A 1 69 80
2 Mr B 1 71 87
3 Mr C 1 92 90
> class(dd1) %判断dd1的数据类型。
[1] "data.frame"
由结果可知合并后的数据仍为数据框,不改变数据类型 。
3.3数据框内部的一些处理(sapply函数生成数值,lapply函数生成列表)
sapply(dd[,c(2,3)],mean)
group score
1.00000 77.33333
> class(sapply(dd[,c(2,3)],mean))
[1] "numeric"
> lapply(dd[,c(2,3)],mean)
$group
[1] 1
$score
[1] 77.33333
> class(lapply(dd[,c(2,3)],mean))
[1] "list"
age<-c(33,35,36)
> weight_height<-matrix(c(66,57,50,171,180,159),3,2)
> sex<-c(1,1,2)
> ht<-data.frame(age,weight_height,sex)
> ht
age X1 X2 sex
1 33 66 171 1
2 35 57 180 1
3 36 50 159 2
> sapply(ht,mean)
age X1 X2 sex
34.666667 57.666667 170.000000 1.333333
> lapply(ht,mean)
$age
[1] 34.66667
$X1
[1] 57.66667
$X2
[1] 170
$sex
[1] 1.333333
|
|