找回密码
 注册
查看: 2581|回复: 0

向量、矩阵、数据框汇总

[复制链接]
发表于 2015-11-19 17:55:15 | 显示全部楼层 |阅读模式
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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2025-4-3 14:23 , Processed in 0.025394 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表