04.数据结构Ⅱ—数据框,因子,列表四、数据框(数据表)R语言中做统计分析的样本数据,都是按数据框类型操作的。数据框的每一列代表一个变量属性的所有取值,每一行代表一条样本数据。1.创建数据框通过函数data.frame()把多个向量组合起来创建,并设置列名称。其基本格式为:data.frame(col1,col2,col3,...)其中,列向量col1,col2,col3,…可以为任意类型。注:矩阵也可以通过函数data.frame()转化为数据库。data_iris-data.frame(Sepal.Length=c(5.1,4.9,4.7,4.6),Sepal.Width=c(3.5,3.0,3.2,3.1),Petal.Length=c(1.4,1.4,1.3,1.5),Petal.Width=rep(0.2,4))data_irisSepal.LengthSepal.WidthPetal.LengthPetal.Width15.13.51.40.224.93.01.40.234.73.21.30.244.63.11.50.2#矩阵转化为数据框dmatrix-matrix(1:8,c(4,2))dmatrix[,1][,2][1,]15[2,]26[3,]37[4,]48data.frame(dmatrix)X1X21152263374482.数据框索引列标或列名称索引:data_iris[,1]——返回数据框data_iris的第1列data_iris$Sepal.Length或data_iris[Sepal.Length]——同data_iris[,1]行索引:data_iris[1,]——返回数据框data_iris的第1行data_iris[1:3,]——返回数据框data_iris的第1至3行元素索引:data_iris[1,1]——返回数据框data_iris的第1列第1个数据data_iris$Sepal.Length[1]或data_iris[Sepal.Length][1]——返回数据框data_iris的Sepal.Length列第1个数据用函数subset()按条件索引subset(data_iris,Sepal.Length5)Sepal.LengthSepal.WidthPetal.LengthPetal.Width24.93.01.40.234.73.21.30.244.63.11.50.2注:还可用sqldf包中的sqldf()函数,借助sql语句索引。例如,library(sqldf)sqldf(select*frommtcarswherecarb=1orderbympg,row.names=TRUE)3.数据框的编辑类似矩阵操作,可通过函数rbind(),增加行(样本数据),要求宽度(列数)相同;函数cbind(),增加列(属性变量),要求高度(行数)相同。删除样本(行),类似矩阵操作。用函数names()查看或修改数据框的列名。#增加样本数据(行)data_iris-rbind(data_iris,list(5.0,3.6,1.4,0.2))data_irisSepal.LengthSepal.WidthPetal.LengthPetal.Width15.13.51.40.224.93.01.40.234.73.21.30.244.63.11.50.255.03.61.40.2#增加属性变量(列)data_iris-cbind(data_iris,Species=rep(setosa,5))data_irisSepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies15.13.51.40.2setosa24.93.01.40.2setosa34.73.21.30.2setosa44.63.11.50.2setosa55.03.61.40.2setosa#删除数据data_iris[,-1]#删除第1列Sepal.WidthPetal.LengthPetal.WidthSpecies13.51.40.2setosa23.01.40.2setosa33.21.30.2setosa43.11.50.2setosa53.61.40.2setosadata_iris[-1,]#删除第1行Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies24.93.01.40.2setosa34.73.21.30.2setosa44.63.11.50.2setosa55.03.61.40.2setosa#编辑数据框列名names(data_iris)#查看数据框列名[1]Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpeciesnames(data_iris)[1]=sepal.length#修改第1列列名names(data_iris)[1]sepal.lengthSepal.WidthPetal.LengthPetal.WidthSpecies五、因子(factor)变量分为名义型(无顺序好坏之分的分类变量,如性别)、有序型(有顺序好坏之分的分类变量,如疗效)、连续型(通常的数值变量,可带小数位)。名义型和有序型的类别变量,在R中称为因子。因子提供了一个简单且紧凑的形式来处理分类数据,因子用水平来表示所有可能的取值,例如,性别有两个水平:男、女。1.创建因子(1)用函数factor(),基本格式为:factor(x,levels,labels=...,exclude=...,ordered=...,nmax=...)其中,x为创建因子的数据向量;levels指定因子的水平数,默认为x中不重复的所有值;labels设置各水平名称(前缀),与水平一一对应;exclude指定有哪些水平是不需要的;ordered设置是否对因子水平排序,默认为TRUE即有序因子,FALSE为无序因子;nmax设定水平数的上限。ff-factor(substring(statistics,1:10,1:10),levels=letters)ff[1]statisticsLevels:abcdefghijklmnopqrstuvwxyzff[,drop=TRUE]#去掉未包含在向量中的水平,同f.-factor(ff)[1]statisticsLevels:acistfactor(1:10,labels=let)[1]let1let2let3let4let5let6let7let8let9let10Levels:let1let2let3let4let5let6let7let8let9let10factor(LETTERS[3:1],ordered=TRUE)[1]CBALevels:ABC注:函数substring()用来提取字符串的子串,第2个参数是起始位置,第3个参数是终止位置;letters和LETTERS是R中专有变量,表示26个小写/大写字母组成的字符向量。(2)用函数gl()创建因子序列用函数gl()生成不同水平的因子序列,基本格式为:gl(n,k,length=n*k,labels=seq_len(n),ordered=FALSE)其中,n表示因子水平数;k表示每个水平的重复数;length表示生成序列的长度;labels为表示因子水平的n维向量;ordered指定是否为有序因子,TRUE为有序因子,FALSE为无序因子。#生成水平数为3,每个水平重复2次的因子序列gl(3,2)[1]112233Levels:123#生成水平为“TRUE”和“FALSE”,每个水平重复3次的因子序列gl(2,3,labels=c(TRUE,FALSE))[1]TRUETRUETRUEFALSEFALSEFALSELevels:TRUEFALSE#生成水平数为2,序列长度为10的因子序列gl(2,1,10)[1]1212121212Levels:12#生成水平数为3,每个水平重复2次的有序因子序列gl(3,2,ordered=TRUE)[1]112233Levels:1232.因子的存储方式R语言中,因子是以整数型向量存储的,每个因子水平对应一个整数型的数。对字符型向量创建的因子,会按照字母顺序排序,再对应到整数型向量。status-c(Poor,Improved,Excellent,Poor)class(status)[1]characterstatus.factor-factor(status,ordered=TRUE)status.factor[1]PoorImprovedExcellentPoorLevels:ExcellentImprovedPoorclass(status.factor)[1]orderedfactorstorage.mode(status.factor)[1]integeras.numeric(status.factor)[1]3213levels(status.factor)[1]ExcellentImprovedPoor六、列表列表就是一些对象或成分的有序集合(组合方式更自由)。列表允许整合若干对象到单个对象名下,例如,某个列表可能是若干向量、矩阵、数据框,甚至是其它列表的组合。一般在使用R语言进行数据分析和挖掘的过程中,向量和数据框是用的最多的,列表常在存储较复杂的数据时作为数据对象类型。列表提供了一种简单的方式来组织和重新调用不相干的信息。另外,许多R函数的运行结果都是用列表形式返回的。1.创建列表用函数list(),基本格式为:list(object1,object2,...)其中,object对象可以是任何类型。若同时为列表中的对象命名:list(name1=object1,name2=object2,...)data-list(a=c(1,2,3,4),b=c(one,two,three),c=c(TRUE,FALSE),d=(1+2i))data$a[1]1234$b[1]onetwothree$c[1]TRUEFALSE$d[1]1+2i#查看列表的数据结构summary(data)LengthClassModea4-none-numericb3-none-characterc2-none-logicald1-none-complex#创建一个内含多种结构的列表g-MyListh-c(25,26,18,39)j-matrix(1:10,nrow=5)mylist-list(title=g,ages=h,j)mylist$title[1]MyList$ages[1]25261839[[3]][,1][,2][1,]16[2,]27[3,]38[4,]49[5,]510summary(mylist)LengthClassModetitle1-none-characterages4-none-numeric10-none-numeric2.列表索引与数据框操作类似,但是用双重方括号。data[[1]]——索引列表data的第1列data[[a]]——按名称索引,同data[[1]]data$a——索引列表data的名称为a的列data[[1]][1]——索引列表data的第1列的第1个元素3.列表的编辑与向量的编辑类似,使用函数c()进行合并。注意:不同于其他数据结构,将列表转化为向量需要用到函数unlist()#向列表增加列data1-c(data,list(e=c(5,6,7)))data1$a[1]1234$b[1]onetwothree$c[1]TRUEFALSE$d[1]1+2i$e[1]567#上述的等价形式data2-c(data,e=list(c(5,6,7)))