1、综述
数据框可以类比matrix,数据框可以理解为每列的mode不同的matrix;这一点很像list和向量的关系:list是mode可以不同的向量。
同时,数据框也可以和list类别,数据框的组件间的mode可以不同,list也是,但是数据框不同组建的长度必须相同,而list可以不同。因此就技术层面而言,数据框是每个组件长度都相等的列表。
2、基本操作
2.1 创建
> d<-data.frame(kids,ages,stringAsFactors=FALSE)
> kids<-c("Jack","Jill")
> ages<-c(12,10)
> d<-data.frame(kids,ages,stringsAsFactors=FALSE)
> d
kids ages stringAsFactors
1 Jack 12 FALSE
2 Jill 10 FALSE
stringAsFactors,默认值为TRUE,表示会将string变为factor.
2.2 访问
#方法一:采用组件的索引值
> d[[1]]
[1] "Jack" "Jill"
#方法二:采用组件名
> d$kids
[1] "Jack" "Jill"
#方法三:类似数组的操作方式
> d[,1]
[1] "Jack" "Jill"
#访问第一列
> d[1,]
kids ages
1 Jack 12
2.3 使用str() 查看数据框结构
> d
kids ages
1 Jack 12
2 Jill 10
> str(d)
'data.frame': 2 obs. of 2 variables:
$ kids: Factor w/ 2 levels "Jack","Jill": 1 2
$ ages: num 12 10
2.4 数据框的拆分与组合
2.4.1 取子集合
> examsquiz
exam.1 exam.2 quiz
1 2.0 3.3 4.0
2 3.3 2.0 3.7
3 4.0 4.0 4.0
4 2.3 0.0 3.3
5 2.3 1.0 3.3
6 3.3 3.7 4.0
#方法一,取出的一列类型为向量
> examsquiz[2:5,2]
[1] 2 4 0 1
> class(examsquiz[2:5,2])
[1] "numeric"
#方法二,添加了drop=FALSE后,取出的一列类型为data.frame
> examsquiz[2:5,2,drop=FALSE]
exam.2
2 2
3 4
4 0
5 1
> class(examsquiz[2:5,2,drop=FALSE])
[1] "data.frame"
#方法三,条件筛选
> examsquiz[examsquiz$exam.1>3,]
exam.1 exam.2 quiz
2 3.3 2.0 3.7
3 4.0 4.0 4.0
6 3.3 3.7 4.0
#方法四,subset()筛选函数,采用该函数筛选,会将筛选条件<span style="font-family: Arial, Helvetica, sans-serif;">exam.1中含NA的行自动去除掉;而上面的方法三则不能去除NA</span>
<pre name="code" class="plain">> subset(examsquiz,exam.1>3)
2.3.2 组合
#rbind()函数添加行
> d
kids ages
1 Jack 12
2 Bill 10
> d<-rbind(d,list("Tom",10))
> d
kids ages
1 Jack 12
2 Bill 10
3 Tom 10
#注意,添加的时候,要用list("Tom",10),因为,Tom和10的数据类型不同。
#cbind()函数添加列
> d<-cbind(d,list(1,1,1))
> d
kids ages 1 1 1
1 Jack 12 1 1 1
2 Bill 10 1 1 1
3 Tom 10 1 1 1
#注意,上面例子中,添加列是采用了list的形式,则添加除了,因为frame的列列内的数据类型必须相同,而list中每个组件的数据类型不同,故R自动创建了三个列,来分别放置list的三个组件。
#采用c()的时候,则只新建了一列。
> d<-cbind(d,c(1,1,1))
> d
kids ages 1 1 1 c(1, 1, 1)
1 Jack 12 1 1 1 1
2 Bill 10 1 1 1 1
3 Tom 10 1 1 1 1
merge() 函数:根据两个数据表中的相同的列,将两个数据表合并到一起
#当两个数据表中有名字相同的列时
> d1
kids states
1 Jack CA
2 Jill MA
3 Jillian MA
4 John HI
> d2
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
> d3<-merge(d1,d2)
> d3
kids states ages
1 Jack CA 12
2 Jill MA 10
#当两个数据表中没有名字相同的列时,
> names(d1)
[1] "kids" "states"
> names(d1)[1]<-"name"
> d1
name states
1 Jack CA
2 Jill MA
3 Jillian MA
4 John HI
> d3<-merge(d1,d2,by.x="name",by.y="kids")
> d3
name states ages
1 Jack CA 12
2 Jill MA 10
2.4 NA处理
2.4.1 进行函数运算时对NA的处理
#函数操作时,去掉NA
> x<-c(2,NA,4)
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 3
2.4.2 选出不含NA的frame集
#生成一个带有NA的frame
> kids<-c('Jack',NA,'Jillian','John')
> states<-c('CA','MA','MA',NA)
> d<-data.frame(kids,states)
> d
kids states
1 Jack CA
2 <NA> MA
3 Jillian MA
4 John <NA>
#方法一:取出不含NA的行,可以通过这种方法,过滤部分列同时保留在某些列中含有NA的item
> complete.cases(d)
[1] TRUE FALSE TRUE FALSE
> d2<-d[complete.cases(d),]
> d2
kids states
1 Jack CA
3 Jillian MA
<pre name="code" class="plain">#方法二:取出不含NA的行,会将所有含NA的行都去除,不如方法一灵活,但很简单省力。
> na.omit(d)
kids states
1 Jack CA
3 Jillian MA
2.5 rbind(),cbind(),apply()函数