第三天 R语言对象:向量和矩阵及其操作
R语言主要分析的对象是数据集,R语言数据集主要是向量、矩阵、数据框、列表、数组等,我们主要介绍前4种。本文先介绍向量和矩阵。
一、向量(一维数据)
向量是R语言中最基本的数据对象类型,它可以是数值型、字符型、逻辑值型、复数型。注意:同一向量不能混杂多种不同类型的数据。
在医学数据分析中,向量相当于一个变量,向量名为变量名,向量值为变量值。
1. 创建向量
通过函数c( )实现向量创建功能,例如
x1<-c(2,3,5,7,10)
x1
[1] 2 3 5 7 10
>x2<-c('a','b','c')
>x2
[1] 'a' 'b' 'c'
2. 向量索引(子集提取)
向量子集索引一般采用中括号[ ],根据元素所在的位置或者名称提取元素。向量子集的提取常见方法包括位置的提取、根据值大小提取、名称的提取、采用subset( )函数提取。
第一种方法:位置提取法
(1)下标索引(注意:R中下标是从1开始的),例如
x1[1] #返回x1的第1个元素
x1[-1] #返回除第一个元素之外的所有元素
x1[c(2:4)] #返回x1的第2至4个元素
x1[-c(2:4)] #返回x1的除第2至4元素之外的所有元素
(2) which元素位置
通过函数which( )返回逻辑向量中为TRUE的位置;
which.max(x1)返回向量x1中最大值所在的位置;
which.min(x1)返回向量x1中最小值所在的位置。
> x1<-c(2,3,5,7,10)
> x1[which(x1>3 & x1<8)]
[1] 5 7
> x1[which.max(x1)]
ten
10
第二种方法:根据值大小提取
> x1<-c(2,3,5,7,10)
> x1[x1>3 & x1<8] # 产生大于3 又小于8的子集
[1] 5 7
第三种方法:根据名称索引
先给向量中的每个元素命名,再通过名称访问对应的元素:
> names(x1)<-c('two','three','five','seven','ten')
> x1[c('three','seven')]
three seven
3 7
第四种方法:subset生成子集
检索向量中满足条件的元素,提取出来:
> subset(x1,x1>3 & x1<8)
five seven
5 7
3. 向量的编辑
对已创建向量进行增加或删除元素。
(1)增加元素
>x<-1:5
>x
[1] 1 2 3 4 5
>x<-c(x, c(6,7,8)) # 在x后面增加6、7、8
>x
[1] 1 2 3 4 5 6 7 8
>x[10]=10 # 增加一个元素,第十个位置为10,第九个为缺失,缺失值用NA表示
>x
[1] 1 2 3 4 5 6 7 8 NA 10
(2)删除元素
>x=1:8
>x
[1] 1 2 3 4 5 6 7 8
>x<-x[-c(3,5)] # 加负号,是反向删除,这是最常见的方式
>x
[1] 1 2 4 6 7 8
>x<-x[-1] # 删去第一个元素
>x
[1] 2 4 6 7 8
4.向量排序
函数sort(),基本格式:
sort(x,decreasing=FALSE, na.last= FALSE,...)
其中,x为排序对象(数值型或字符型);decreasing默认为FALSE即升序,TURE为降序;na.last默认为FALSE,若为TRUE,则将向量中的NA值放到序列末尾。
函数rank( ),返回值是该向量中对应元素的“排名”。
函数order(),返回值是对应“排名”的元素所在向量中的位置,例如,
>x<-c(1,5,8,2,9,7,4)
>x
[1] 1 5 8 2 9 7 4
>order(x)
[1] 1 4 7 2 6 3 5
说明:默认按升序,排名第2的元素在原向量的第4个位置。
函数rev( ),将序列进行反转,即1,2,3变成3,2,1
5.向量的基本运算
向量基本运算函数也比较多,以下陈列部分:
length(x1) #向量的长度
[1] 5
> mean(x1) #计算向量均数
[1] 5.4
> sd(x1) #计算向量的均数
[1] 3.209361
> sum(x1) #计算向量的总计
[1] 27
> median(x1) #计算向量的中位数
[1] 5
二、矩阵(二维数据)
矩阵是二维数组,可以描述二维数据。它要求矩阵内各元素有相同的类型,都是数值型,或者字符串型。在医学数据分析中,一般情况下数据集不太会是矩阵,矩阵一般会出现数据分析结果中。
1.创建矩阵
矩阵一般在向量的基础上产生,常用的函数为matrix()和dim( )
函数matrix(),基本格式为:
matrix(x, nrow=..., ncol=..., byrow=..., dimnames=...)
其中,x为数据向量作为矩阵的元素;nrow设定行数;ncol设定列数;byrow设置是否按行填充,默认为FALSE(按列填充);dimnames用字符型向量表示矩阵的行名和列名。
>x<-1:6
>x
[1] 1 2 3 4 5 6
>a<-matrix(x,nrow=3,ncol=2) #采用matrix产生3行2列矩阵
>a
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> b<-matrix(x,nrow=3,ncol=2,byrow=F, dimnames=list(c('r1','r2','r3'), c('c1','c2')))
> b
c1 c2
r1 1 4
r2 2 5
r3 3 6
函数dim(),主要方式是将向量设定为2维,具有规定行列数的矩阵:
>dim(x)=c(3,2) # 设为3行2列的矩阵
>x
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.矩阵索引(子集提取)
矩阵子集的提取和向量类似,主要以中括号[ ]方法提取,由于它是二维数据,可以通过[ , ]分别提取行和列。主要的提取方式包括位置提取、名称提取和值大小的提取
位置提取
a[i,j] #返回矩阵a的第i行,第j列的元素
a[i,] #返回矩阵a的第i行
a[,j] #返回矩阵a的第j列
a[c(i:j),] #返回矩阵a的第i至第j行
a[i,j] #返回矩阵a的第i行,第j列的元素
按名称索引:
b['r2','c1'] #返回矩阵c的第r2行,第c1列的元素2
按值大小提取
b[,r2=2] # 返回“r2”一行值为2的一列
b[,r2=2] # 返回“r2”一行值为2的一列
3.矩阵的编辑
数据库合并
函数rbind(A,B), 纵向合并(增加行),要求列数相同;
函数cbind(C,D), 衡向合并(增加列),要求行数相同。
注意:rbind(A,1) 相当于给矩阵A增加一行“1”。
> rbind(a,b)
c1 c2
1 4
2 5
3 6
r1 1 4
r2 2 5
r3 3 6
> cbind(a,b)
c1 c2
r1 1 4 1 4
r2 2 5 2 5
r3 3 6 3 6
数据库删减
a[-1,],删除矩阵a的第一行
a[,-1],删除矩阵a的第一列
a[-c(2:4),],删除矩阵a的第2至4行
4.矩阵的运算
+-*/——四则运算(要求矩阵维数相同)
colSums() #对矩阵的各列求和
rowSums() #对矩阵的各行求和
colMeans() #对矩阵的各列求均值
rowMeans() #对矩阵的各行求均值
t() #对矩阵转置
%*% #矩阵乘法(要求左阵的列数=右阵的行数)
diag() #取矩阵对角线元素生成对角矩阵,若对象是向量,则以该向量作为对角元素
solve() #返回逆矩阵(要求矩阵可逆)
eigen() #返回矩阵的特征值与特征向量
DAY3的内容就介绍到这里!
最后,一个月就能学会R语言,你敢挑战一下吗?