上一节简要介绍了Dataframe的定义。 在本节中,我们将具体看看Dataframe的操作
首先,请参考data.frame ()、r语言帮助文档,了解如何使用数据框创建函数(data.frame )。
使用
DATA.frame(…,row.names=NULL,check.rows=FALSE,
check.names=TRUE,fix.empty.names=TRUE,
stringsasfactors=default.stringsasfactors ()
default.stringsAsFactors (
数组
. theseargumentsareofeithertheformvalueortag=value.componentnamesarecreatedbasedonthetag (if present ) orthedeparsed
row.names 3360 nullorasingleintegerorcharacterstringspecifyingacolumntobeusedasrownames,oracharacterorintegervectorgivingthes
当然,后面还有很多参数的具体用法,这里不再赘述。 主要用前两个。 首先,“.”表示表数据。 是构成数据框的数据主体。 row.names ) )是组成数据框的行的名称。 数据框相当于r语言的表,应该同时有行名和列名,所以列名是如何给定的呢? 我们知道很多数据处理软件和算法都是以数据的列为单位进行的。 以前,构建矩阵时,也会为每列输入缺省值。 byrow=FALSE,列名称在创建数据框时就已经确定。 有关详细信息,请参阅以下代码:
创建一个名为" mydataframe "的数据框。 首先,标识数据框中的列,然后调用函数data.frame ()函数
C1
C2
C3
C4
C5
我的数据帧
我的数据帧
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
cnames
rnames
镜像光线
镜像光线
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更具普遍性,矩阵使用更频繁,也就是说,实际创建一个数据框,并看看其具体操作。
雌性
StudentID
子jects
scores
结果
结果
StudentID names subjects scores
1 2014闪闪发光的指甲油英语87
2 2015 mrdtk英语98
3 2016年魅力自行车英语93
因此,如果没有在数据框中指定行号,系统将默认从1开始为每行分配行号。 这与Excel表有点相似。 像往常一样,首先学习dataframe数据类型的基本操作
访问数据框元素:因为矩阵是一个特殊的数据框,所以访问矩阵元素的方式是否也适用于dataframe? 相反,由于数据框以行或列为单位(矩阵可以重排),因此您知道在访问元素时只能在行或列之间进行访问。 即dataframe[1,] (访问第一行)、
dataframe[,1](访问第一列)采用这种方式访问列时,返回值是按行排列的形式。访问列同样也可以直接使用dataframe(1)访问第一列,或者dataframe(列名)来访问指定的列。也可以连续访问若干列,详见代码:> 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 mrdtk
3 妩媚的自行车
> Result[1:3,] #访问1-3行
StudentID names subjects scores
1 2014 闪闪的指甲油 英语 87
2 2015 mrdtk 英语 98
3 2016 妩媚的自行车 英语 93
> Result[1:3] #访问1-3列
StudentID names subjects
1 2014 闪闪的指甲油 英语
2 2015 mrdtk 英语
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 mrdtk 98
3 妩媚的自行车 93
由上可得:对数据框操作,必须以向量为单位,使用c( ) or list( ),通过上述了解,我们发现,普通的访问必须带着行名和列名,这有的时候给我们带来不必要的麻烦,比如我要计算成绩平均值,带上列名Score会给我们带来一些困惑,于是有哪些方法可以在访问数据库元素时不带着行名或者列名呢?
方法一:用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
> score
> detach(Result)
> name
[1] "闪闪的指甲油" "mrdtk" "妩媚的自行车"
> score
[1] 87 98 93
> mean(score)
[1] 92.66667
开心的云朵:用with函数
> with(Result,{score
> score
[1] 87 98 93
上面谈到了dataframe的创建和读取,如果我需要添加或者删除某一列该怎么办呢?
> Result$age
> Result
StudentID names subjects scores age
1 2014 闪闪的指甲油 英语 87 12
2 2015 mrdtk 英语 98 14
3 2016 妩媚的自行车 英语 93 13
> Result2
> 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 mrdtk 英语 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
> 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
> 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
> 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
> c
[1] 9 10 11 12
> is.vector(c)
[1] TRUE
> mean(c)
[1] 10.5
> sum(c)
[1] 42
同时,也可以利用dataframe$(新的列名)
> mydataframe$sum
> mydataframe$mean
> 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
> x2
> mydataframe2
> 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