上节咱们简单介绍了Dataframe的定义,这节咱们具体来看一下Dataframe的操做算法
首先,数据框的建立函数为 data.frame( ),参考R语言的帮助文档,咱们来了解一下data.frame( )的具体用法:数据库
Usage data.frame(..., row.names = NULL, check.rows = FALSE, check.names = TRUE, fix.empty.names = TRUE, stringsAsFactors = default.stringsAsFactors()) default.stringsAsFactors() Arguments ... :these arguments are of either the form value or tag = value. Component names are created based on the tag (if present) or the deparsed argument itself. row.names :NULL or a single integer or character string specifying a column to be used as row names, or a character or integer vector giving the row names for the data frame.
固然,后面还有不少参数的具体用法,在此不作一一赘述,主要用到的就是前两个。首先,“...”表明了表格数据,就是要构成数据框的数据主体,row.names( )为要构成数据框的行名,那么既然数据框至关于R语言的一个表格,应该既有行名也有列名才对,那么列名又是如何给出的呢?咱们知道,不少的数据处理软件以及算法是以数据的列为单位进行的,以前咱们构建矩阵的时候,默认也是按列填充(byrow=FALSE),而列名在建立数据框开始咱们就已经肯定好了的。详见下面代码:数组
我想要建立一个名为“mydataframe”的数据框,首先肯定数据框里面的列有哪些,而后调用函数data.frame( )函数数据结构
> C1 <-c(1,2,3,4) > C2 <-c(5,6,7,8) > C3 <-c(9,10,11,12) > C4 <-c(13,14,15,16) > C5 <-c(17,18,19,20) > mydataframe <- data.frame(C1,C2,C3,C4,C5,row.names = c("R1","R2","R3","R4")) > mydataframe C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20
因而可知,数据框是把现有的列拼接成一个表格的一种数据结构,细心的朋友会发现,这个数据框怎么跟上节咱们讲过的矩阵长得那么同样!!!再回顾一下上节的矩阵建立:函数
> mydata <- c(1:20) > cnames <- c("C1","C2","C3","C4","C5") > rnames <- c("R1","R2","R3","R4") > myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames)) > myarray C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20
确实,从长相上来讲分不出差异,可是矩阵里面的元素必须一致,而数据框能够是各类类型数据的集合。这种集合不是无条件乱七八糟的集合,而是以列为单位,不一样列的元素类型能够不一样,可是同一列的元素类型必须一致。所以,矩阵能够看作特殊的数据框类型那么这么作有什么意义呢?在数据统计中,咱们须要有各类各样类型的数据,就拿简单的成绩单来讲,就包含了“姓名”,“学号”,“科目”等字符型元素,也包括“分数”等数值型元素,还有“是否经过”等布尔型元素,所以,从普遍意义上来讲,dataframe更具备普适性,矩阵多用在数学计算中。说归说,咱们来实际建立一个数据框,而后再演示一下它的具体操做:学习
> names <- c("小明","小红","小兰") > StudentID <- c("2014","2015","2016") > subjects <- c("英语","英语","英语") > scores <- c(87,98,93) > Result <- data.frame(StudentID,names,subjects,scores) > Result StudentID names subjects scores 1 2014 小明 英语 87 2 2015 小红 英语 98 3 2016 小兰 英语 93
由上可见,当没有给数据框指定行名的时候,系统会默认从1开始给每行一个行号,这跟Excel表格有点相似。 仍是同往常同样,咱们先学习dataframe数据类型的基本操做spa
数据框元素的访问:既然矩阵是特殊的数据框,那么矩阵元素的访问方式应该也一样适用于dataframe吗?不是这样,咱们知道,数据框是以行或者列为单位(行列能够转置),所以访问元素时只能整行或者整列访问。即dataframe[1,](访问第一行),dataframe[,1](访问第一列)采用这种方式访问列时,返回值是按行排列的形式。访问列一样也能够直接使用dataframe(1)访问第一列,或者dataframe(列名)来访问指定的列。也能够连续访问若干列,详见代码:orm
> Result[1,] #访问第一行 StudentID names subjects scores 1 2014 小明 英语 87 > Result[,1] #访问第一列 [1] 2014 2015 2016 Levels: 2014 2015 2016 > Result[1] #访问第一列 StudentID 1 2014 2 2015 3 2016 > Result["names"] #访问指定标号的列 names 1 小明 2 小红 3 小兰
> Result[1:3,] #访问1-3行 StudentID names subjects scores 1 2014 小明 英语 87 2 2015 小红 英语 98 3 2016 小兰 英语 93 > Result[1:3] #访问1-3列 StudentID names subjects 1 2014 小明 英语 2 2015 小红 英语 3 2016 小兰 英语 > Result[c(1,3),] #只访问1,3行,注意写法 c( ) StudentID names subjects scores 1 2014 小明 英语 87 3 2016 小兰 英语 93 > Result[c(1,4)] #只访问1,4列,注意写法 c( ) StudentID scores 1 2014 87 2 2015 98 3 2016 93 > Result[c("names","scores")] #只访问names和scores列,注意写法 c( ) names scores 1 小明 87 2 小红 98 3 小兰 93
由上可得:对数据框操做,必须以向量为单位,使用c( ) or list( ),经过上述了解,咱们发现,普通的访问必须带着行名和列名,这有的时候给咱们带来没必要要的麻烦,好比我要计算成绩平均值,带上列名Score会给咱们带来一些困惑,因而有哪些方法能够在访问数据库元素时不带着行名或者列名呢?blog
方法一:用attach和detach函数,好比要打印全部names,那么能够写成:索引
> attach(Result) The following objects are masked _by_ .GlobalEnv: names, scores, StudentID, subjects The following objects are masked from Result (pos = 3): names, scores, StudentID, subjects > name <- names > score <-scores > detach(Result) > name [1] "小明" "小红" "小兰" > score [1] 87 98 93 > mean(score) [1] 92.66667
方法二:用with函数
> with(Result,{score <- scores}) > score [1] 87 98 93
上面谈到了dataframe的建立和读取,若是我须要添加或者删除某一列该怎么办呢?
> Result$age<-c(12,14,13) #添加age列 > Result StudentID names subjects scores age 1 2014 小明 英语 87 12 2 2015 小红 英语 98 14 3 2016 小兰 英语 93 13
> Result2 <- Result[-2] #删除name列 > Result2 StudentID subjects scores age 1 2014 英语 87 12 2 2015 英语 98 14 3 2016 英语 93 13
若是我须要查询成绩等于98的学生的信息该怎么办呢?
> Result[which(Result$scores==98),] StudentID names subjects scores age 2 2015 小红 英语 98 14
上面说过了,矩阵和数据框也是两种不一样的数据类型,咱们知道数据类型之间能够互相转换,用is.***( )能够判断某个变量是否为***类型,用as.***( )则将某个变量转换为***类型。那么相应的,矩阵转换为数据框类型则应为:
> myarray C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > myarrayframe <- as.data.frame(myarray) > myarrayframe C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > is.data.frame(myarray) [1] FALSE > is.data.frame(myarrayframe) [1] TRUE
跟矩阵matrix操做同样,数据框也有rbind和cbind函数,用法大体相同,有兴趣的朋友能够简单联系一下,这里再也不赘述。
最后,咱们来谈一下数据框数据处理操做:
上面咱们讲到,利用dataframe[ 列号 ]或者dataframe[ 列值 ]能够读取数据框的某一列,返回值仍为数据框类型,可是这部分数据不方便直接利用咱们以前讲过的求和,求平均值等方法进行计算分析,由于读取的数据带有“行名/列名”,这个为字符型变量。有的人会问,我在建立数据框的时候,不加行名和列名不就好了?第一,在建立数据框的时候,会默认给你分配行名或者列名,第二,就算不分配行名或者列名,那数据框建立起来还有什么意义?
> mydataframe C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > mydataframe["C4"] C4 R1 13 R2 14 R3 15 R4 16 > mean(mydataframe["C4"]) [1] NA Warning message: In mean.default(mydataframe["C4"]) : 参数不是数值也不是逻辑值:回覆NA > is.data.frame(mydataframe["C4"]) [1] TRUE
方法一:将数据框格式从新转化为矩阵格式,而后按照矩阵索引的方式来找寻要处理的数据组,利用矩阵或者向量中相关函数来进行必定的数据处理。
> myarray2 <- as.matrix(mydataframe) > is.matrix(myarray2) [1] TRUE > myarray2 C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > x <- myarray[,3] #读取第3列的值 > x R1 R2 R3 R4 9 10 11 12 > is.vector(x) #查看x是否为向量类型 [1] TRUE > mean(x) [1] 10.5 > sum(x) [1] 42
方法二:在读取数据框列的时候换用另一种方法,dataframe$(行名或者列名),返回值是vector类型
> c <- mydataframe$C3 > c [1] 9 10 11 12 > is.vector(c) [1] TRUE > mean(c) [1] 10.5 > sum(c) [1] 42
同时,也能够利用dataframe$(新的列名) <- 新的向量,来给dataframe添加新的列,具体操做以下:
> mydataframe$sum <- mydataframe$C1 +mydataframe$C4 > mydataframe$mean <- (mydataframe$C1+mydataframe$C4)/2 > mydataframe C1 C2 C3 C4 C5 sum mean R1 1 5 9 13 17 14 7 R2 2 6 10 14 18 16 8 R3 3 7 11 15 19 18 9 R4 4 8 12 16 20 20 10
最推崇的是下一种方法,直接利用transform函数组建新的数据框,具体用法以下:
> x1 <- mydataframe$C1 > x2 <- mydataframe$C3 > mydataframe2 <- transform(mydataframe,sum2=x1+x2,mean2=(x1+x2)/2) > mydataframe2 C1 C2 C3 C4 C5 sum mean sum2 mean2 R1 1 5 9 13 17 14 7 10 5 R2 2 6 10 14 18 16 8 12 6 R3 3 7 11 15 19 18 9 14 7 R4 4 8 12 16 20 20 10 16 8