R语言基础数据结构
R语言常用的数据结构共有六种,包括向量(Vector)、矩阵(Matrix)、数组(Array)、因子(Factor)、数据框(Data.Frame)、列表(List)。
目录
R语言基础结构
一、数据结构
1、向量(Vector)
(1)向量(Vector)自创建的三种方式
(2)向量(Vector)的索引和取值
(3)向量(Vector)使用逻辑判断取值
(4)向量(Vector)常用函数
2、因子(Factor)
(1)因子(Factor)的创建
(2)因子(Factor)数据类型转换
3、矩阵(Matrix)
(1)矩阵(Matrix)的创建与生成
(2)矩阵(Matrix)的维度及行列名
(3)提取矩阵(Matrix)的信息
(4)矩阵(Matrix)的常用计算及函数
4、数据框(Data.Frame)
(1)数据框的创建与生成
(2)基本函数
(3)数据提取:同矩阵,并增加$
5、数组(Array)
6、列表(List)
二、数据结构判断
一、数据结构
1、向量(Vector)
向量是用于存储数值型(Numeric)、字符型(character)或逻辑型(logical)数据的一维数组。执行组合功能的函数c()可用来创建向量。注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型),当单个向量中拥有不同的类型的数据时,如同时存在数值型和字符型数据时,会转换成字符型向量。
(1)向量(Vector)自创建的三种方式
#1.直接创建
> c(1,2,3,4,5)
[1] 1 2 3 4 5
#2.运用冒号
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
#3.使用seq函数创建
> seq(from=1,to=10,by=2)
[1] 1 3 5 7 9
(2)向量(Vector)的索引和取值
> a=1:10
> a[c(1,2,3)]
[1] 1 2 3
> a[1]#R语言索引从1开始,python索引从0开始
[1] 1
> a[-1]#负号代表剔除
[1] 2 3 4 5 6 7 8 9 10
(3)向量(Vector)使用逻辑判断取值
> a=1:10
> a<5
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
[9] FALSE FALSE
> a[a<5]
[1] 1 2 3 4
(4)向量(Vector)常用函数
#1.循环补齐
> c(1,2,3,4)+c(1,2)
[1] 2 4 4 6
> c(1,2,3,4)-c(1,2)
[1] 0 0 2 2
> c(1,2,3,4)*c(1,2)
[1] 1 4 3 8
#2.mean()函数等
> a=1:10
> mean(a)
[1] 5.5
> sum(a)
[1] 55
> a=c(1,3,7,2,6,2)
> which(a>5)#返回值为位置信息
[1] 3 5
> a[which(a>5)]
[1] 7 6
#3.sort()函数,rank()函数
> a=c(1,3,7,2,6,2)
> sort(a)#默认为升序
[1] 1 2 2 3 6 7
> sort(a,decreasing = T)
[1] 7 6 3 2 2 1
> rank(a)#对向量从小到大进行排序,并得到排序后的序号
[1] 1.0 4.0 6.0 2.5 5.0 2.5
#4.grep()函数,抓取在元素中想要获得的对象,并返回位置
> gene=c("TP11","TP14","MDM5")
> grep("TP",gene)
[1] 1 2
#5.length()函数,获得向量的长度
> a=c(1,3,7,2,6,2)
> length(a)
[1] 6
#6.subset()函数
#基本用法:subset(data,筛选的条件)
> a=c(1,3,7,2,6,2)
> subset(a,a>4)
[1] 7 6
#rep()函数,重复向量
> a=c(1,3,7,2,6,2)
> rep(a,2)
[1] 1 3 7 2 6 2 1 3 7 2 6 2
> rep(a,each=2)
[1] 1 1 3 3 7 7 2 2 6 6 2 2
2、因子(Factor)
在R中名义型变量和有序性变量称为因子,factor。这些分类变量的可能值称为应该水平level,例如good,better,best,都称为一个level;由这些水平之构成的向量称为因子
(1)因子(Factor)的创建
factor(x,ordered,levels)
x:定义的因子
ordered:是否进行排序
levels:排序的顺序,如果未定义顺序,则按照首字母先后顺序排列
(2)因子(Factor)数据类型转换
数值可以直接转换成因子,但因子不能直接转换为数值,需要,转换成字符串或向量后,再转换成数值。
> a<-factor(round(rnorm(5),2))
> a
[1] -0.74 -1.44 -1.19 1.49 -0.28
Levels: -1.44 -1.19 -0.74 -0.28 1.49
> as.numeric(a)
[1] 3 1 2 5 4
> as.numeric(as.character(a))
[1] -0.74 -1.44 -1.19 1.49 -0.28
> as.numeric(as.vector(a))
[1] -0.74 -1.44 -1.19 1.49 -0.28
3、矩阵(Matrix)
矩阵(Matrix)是最常见的二维数据结构之一,二维分别代表行和列
矩阵中每一列的数据是相同的,通常时数值型,偶尔也会用到全是字符串的字符型矩阵
当矩阵中同时存在数值型和字符型数据时,会转换成字符型矩阵
(1)矩阵(Matrix)的创建与生成
#1.通过matrix()函数生成
> data<-rnorm(15)
> data
[1] 0.82162953 1.02864783 -0.27540747 0.49663266
[5] -1.63685433 -0.35058725 0.01179141 0.40300628
[9] -1.15968084 1.98627585 -0.39469700 0.23812107
[13] 0.45055860 -0.58775678 0.86372135
> matrix(data,nrow=5)
[,1] [,2] [,3]
[1,] 0.8216295 -0.35058725 -0.3946970
[2,] 1.0286478 0.01179141 0.2381211
[3,] -0.2754075 0.40300628 0.4505586
[4,] 0.4966327 -1.15968084 -0.5877568
[5,] -1.6368543 1.98627585 0.8637213
> matrix(data,nrow=5,byrow = T)
[,1] [,2] [,3]
[1,] 0.82162953 1.0286478 -0.2754075
[2,] 0.49663266 -1.6368543 -0.3505872
[3,] 0.01179141 0.4030063 -1.1596808
[4,] 1.98627585 -0.3946970 0.2381211
[5,] 0.45055860 -0.5877568 0.8637213
#2.使用rbind()或者cbind()函数合并
> col1<-c(1,2,3)
> col2<-c(3,4,5)
> col3<-c(6,7,8)
> rbind(col1,col2,col3)#逐行合并
[,1] [,2] [,3]
col1 1 2 3
col2 3 4 5
col3 6 7 8
> cbind(col1,col2,col3)#逐列合并
col1 col2 col3
[1,] 1 3 6
[2,] 2 4 7
[3,] 3 5 8
#3.从文件读入或使用as.matrix()函数转化
(2)矩阵(Matrix)的维度及行列名
> data<-matrix(data,nrow=5)
> data
[,1] [,2] [,3]
[1,] -1.1832075 -1.186129 -1.3719325
[2,] -0.6651334 -1.890352 1.8733599
[3,] 1.4455362 -0.453745 0.1370088
[4,] -1.0078466 1.771817 0.7545562
[5,] -0.9555193 2.609297 -1.1188567
> dim(data)#获取矩阵维度
[1] 5 3
> nrow(data)#获取矩阵行数
[1] 5
> ncol(data)#获取矩阵列名
[1] 3
> t(data)#转置矩阵
[,1] [,2] [,3] [,4]
[1,] -1.183208 -0.6651334 1.4455362 -1.0078466
[2,] -1.186129 -1.8903517 -0.4537450 1.7718170
[3,] -1.371932 1.8733599 0.1370088 0.7545562
[,5]
[1,] -0.9555193
[2,] 2.6092972
[3,] -1.1188567
#提取矩阵行列名
> rownames(data)
NULL
> colnames(data)
NULL
> dimnames(data)
NULL
#修改矩阵行列名
> rownames(data)<-c("row1","row2","row3","row4","row5")
> colnames(data)<-c("col1","col2","col3")
> rownames(data)
[1] "row1" "row2" "row3" "row4" "row5"
> colnames(data)
[1] "col1" "col2" "col3"
> dimnames(data)
[[1]]
[1] "row1" "row2" "row3" "row4" "row5"
[[2]]
[1] "col1" "col2" "col3"
(3)提取矩阵(Matrix)的信息
#1.基于位置或名称信息提取
> data<-matrix(data,nrow=5)
> rownames(data)<-c("row1","row2","row3","row4","row5")
> colnames(data)<-c("col1","col2","col3")
> data
col1 col2 col3
row1 -1.1832075 -1.186129 -1.3719325
row2 -0.6651334 -1.890352 1.8733599
row3 1.4455362 -0.453745 0.1370088
row4 -1.0078466 1.771817 0.7545562
row5 -0.9555193 2.609297 -1.1188567
> data["row1","col3"]
[1] -1.371932
> data[1,3]
[1] -1.371932
> data[2,]
col1 col2 col3
-0.6651334 -1.8903517 1.8733599
> data[,2]
row1 row2 row3 row4 row5
-1.186129 -1.890352 -0.453745 1.771817 2.609297
基于逻辑判断提取
> data[col3>0,]
(4)矩阵(Matrix)的常用计算及函数
> data<-matrix(data,nrow=5)
> data
[,1] [,2] [,3]
[1,] -1.1832075 -1.186129 -1.3719325
[2,] -0.6651334 -1.890352 1.8733599
[3,] 1.4455362 -0.453745 0.1370088
[4,] -1.0078466 1.771817 0.7545562
[5,] -0.9555193 2.609297 -1.1188567
> data*3
[,1] [,2] [,3]
[1,] -3.549623 -3.558387 -4.1157974
[2,] -1.995400 -5.671055 5.6200796
[3,] 4.336608 -1.361235 0.4110265
[4,] -3.023540 5.315451 2.2636687
[5,] -2.866558 7.827892 -3.3565702
> rowSums(data)
[1] -3.7412690 -0.6821253 1.1288000 1.5185266
[5] 0.5349211
> colSums(data)
[1] -2.3661708 0.8508885 0.2741357
#apply()函数,
#apply函数主要由三部分构成:数据,行列指向(1表示按行,2表示按列),计算函数
> apply(data,1,mean)
[1] -1.2470897 -0.2273751 0.3762667 0.5061755
[5] 0.1783070
> apply(data,2,function(x)sum(x))
[1] -2.3661708 0.8508885 0.2741357
4、数据框(Data.Frame)
数据框(Data.Frame)每一列内的数据类型是相同的,列之间的数据可以不同
(1)数据框的创建与生成
#1,通过data.frame()函数直接生成
> name=c("xiaoxiao","xiaoha","xiaoxi")
> age=c(1,2,3)
> female=c(1,2,1)
> data<-data.frame(name,age,female)
> data
name age female
1 xiaoxiao 1 1
2 xiaoha 2 2
3 xiaoxi 3 1
#2,通过函数读取
#3,从矩阵转换
> data<-matrix(rnorm(15),nrow=5)
> class(data)
[1] "matrix" "array"
> data1<-as.data.frame(data)
> class(data1)
[1] "data.frame"
(2)基本函数
数据框沿用矩阵中的常用函数,如行列名,维度,行列数,apply()函数等均适用。
> data<-matrix(rnorm(50),nrow=10)
> head(data)#查看数据前几行
[,1] [,2] [,3] [,4]
[1,] 0.927170051 0.11039360 0.1518877 -0.9958674
[2,] -0.308848086 0.23106951 1.2197350 -2.1594594
[3,] 0.004737546 0.19146477 -0.8166223 2.1784072
[4,] -1.240030080 1.57160842 0.7753148 0.5399974
[5,] -2.139280528 -0.06151895 0.8411452 -1.6597603
[6,] -1.306004328 0.32306013 -0.9751941 0.6303062
[,5]
[1,] -1.6449042
[2,] -0.1726496
[3,] 0.4338241
[4,] -0.4006596
[5,] 0.9250183
[6,] -1.6632007
> tail(data)#查看数据后几行
[,1] [,2] [,3] [,4]
[5,] -2.1392805 -0.06151895 0.8411452 -1.65976025
[6,] -1.3060043 0.32306013 -0.9751941 0.63030623
[7,] -0.6417111 -0.73045246 -0.7034463 0.84720445
[8,] -0.4727848 0.25112743 2.3203398 0.18834232
[9,] -0.3266285 0.01976186 -0.6332865 0.34977211
[10,] -1.2673215 0.50224618 -1.1047394 0.07891568
[,5]
[5,] 0.9250183
[6,] -1.6632007
[7,] -0.7437903
[8,] 0.3626313
[9,] -0.4463160
[10,] -0.4758092
> head(data,n=2)
[,1] [,2] [,3] [,4]
[1,] 0.9271701 0.1103936 0.1518877 -0.9958674
[2,] -0.3088481 0.2310695 1.2197350 -2.1594594
[,5]
[1,] -1.6449042
[2,] -0.1726496
(3)数据提取:同矩阵,并增加$
> data1<-as.data.frame(data)
> colnames(data1)<-c("a1","a2","a3","a4","a5")
> data1$a1#查看一列
[1] 0.927170051 -0.308848086 0.004737546 -1.240030080
[5] -2.139280528 -1.306004328 -0.641711081 -0.472784834
[9] -0.326628467 -1.267321492
> data1$a6<-c(1,1,3,4,6,7,1,6,8,7)#增加一列
> data1$a6
[1] 1 1 3 4 6 7 1 6 8 7
5、数组(Array)
数组(Array)与矩阵类似,但维度可以大于2,数组可通过array()函数创建。
myarray <- array ( vector , dimensions , dimnames)
6、列表(List)
列表是各类数据类型的综合体,通常用于存储一系列数据。
#1.创建
> data1<-"haha"
> data2<-c(1,1,34,67)
> data3<-matrix(rnorm(20),nrow=5)
> data4<-data.frame(A=c(1,3,5),B=c(1,59,2),C=c(25,8,37))
> list1<-list(data1,data2,data3,data4)
> list1
[[1]]
[1] "haha"
[[2]]
[1] 1 1 34 67
[[3]]
[,1] [,2] [,3] [,4]
[1,] 1.40391987 -0.3872273 -0.56925471 -1.5023479
[2,] -0.48645122 2.1022144 -0.78480254 -0.7429623
[3,] -0.09993994 -0.4948093 -0.25565934 -0.8256904
[4,] 0.38858715 0.3699124 0.03840727 1.2355474
[5,] -0.40178326 -0.1122504 0.04224269 -0.8818120
[[4]]
A B C
1 1 1 25
2 3 59 8
3 5 2 37
#2.查看命名
> names(list1)
NULL
#更新命名
> names(list1)[1]<-"data1"
#查看
> names(list1)[1]
[1] "data1"
> names(list1)[[1]]
[1] "data1"
> names(list1)
[1] "data1" NA NA NA
> list1[[2]][1]
[1] 1
#合并
> list2<-list(data5=c(15,15,15))
> list3<-c(list1,list2)
> list3
$data1
[1] "haha"
$<NA>
[1] 1 1 34 67
$<NA>
[,1] [,2] [,3] [,4]
[1,] 1.40391987 -0.3872273 -0.56925471 -1.5023479
[2,] -0.48645122 2.1022144 -0.78480254 -0.7429623
[3,] -0.09993994 -0.4948093 -0.25565934 -0.8256904
[4,] 0.38858715 0.3699124 0.03840727 1.2355474
[5,] -0.40178326 -0.1122504 0.04224269 -0.8818120
$<NA>
A B C
1 1 1 25
2 3 59 8
3 5 2 37
$data5
[1] 15 15 15
二、数据结构判断
> list2<-list(data5=c(15,15,15))
> is.vector(list2)
[1] TRUE
> is.matrix(list2)
[1] FALSE
> is.data.frame(list2)
[1] FALSE
> is.factor(list2)
[1] FALSE
> is.array(list2)
[1] FALSE
> is.list(list2)
[1] TRUE