数据框虽然和矩阵相似,都有行、列两个维度,但是数据框的列可以是不同的模式(某列可以是数字,某列可能是字符串)
数据框是每个组件长度都相等的列表。数据框是特殊的列表
1.创建数据框
###########创建数据框
> kids<-c("Jack","Jill")
> ages<-c(12,10)
> d<-data.frame(kids,ages,stringsAsFactors = F)
## stringsAsFactors = F告诉R不将向量转化成因子,默认是转化的
> d
kids ages
1 Jack 12
2 Jill 10
#############访问数据框
> d[[1]]
[1] "Jack" "Jill"
> d$kids
[1] "Jack" "Jill"
> d[,1]
[1] "Jack" "Jill"
##用str()函数查看d的内部结构
> str(d)
'data.frame': 2 obs. of 2 variables:
$ kids: chr "Jack" "Jill"
$ ages: num 12 10
#############命名
> examda<-read.table("C:/Users/NANRUN/Desktop/exam.txt",header = F)
> colnames(examda)<-c("Exam.1","Exam.2","Quiz")
> examda
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
2.矩阵式操作
提取子数据框
> examda[2:4,]
Exam.1 Exam.2 Quiz
2 3.3 2 3.7
3 4.0 4 4.0
4 2.3 0 3.3
> examda[2:4,2]
[1] 2 4 0
> examda[2:4,2,drop=F] ###返回值为数据框
Exam.2
2 2
3 4
4 0
###########筛选
> examda[examda$Exam.1>3.0,]
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(examda,Exam.1>3.0) ####subset()函数筛选
Exam.1 Exam.2 Quiz
2 3.3 NA 4
3 4.0 4.0 4
6 3.3 3.7 4
缺失值的处理
> examda[2,]<-c(3.3,NA,4.0)
> examda
Exam.1 Exam.2 Quiz
1 2.0 3.3 4.0
2 3.3 NA 4.0
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
> mean(examda$Exam.2,na.rm=TRUE)###忽略缺失值
[1] 2.4
#####使用complete.cases()函数去掉含缺失值的行
> complete.cases(examda)
[1] TRUE FALSE TRUE TRUE TRUE TRUE
> examda1<-examda[complete.cases(examda),]
> examda1
Exam.1 Exam.2 Quiz
1 2.0 3.3 4.0
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
使用rbind() 、cbind()函数
使用这两个函数前,要保证两个数据框的行数或者列数相同。
> d<-data.frame(kids,ages,stringsAsFactors = F)
kids ages
1 Jack 12
2 Jill 10
> rbind(d,list("Laura",19))
kids ages
1 Jack 12
2 Jill 10
3 Laura 19
> eq<-cbind(examda,examda$Exam.2-examda$Exam.1)
> class(eq)
[1] "data.frame"
> head(eq)
Exam.1 Exam.2 Quiz examda$Exam.2 - examda$Exam.1
1 2.0 3.3 4.0 1.3
2 3.3 NA 4.0 NA
3 4.0 4.0 4.0 0.0
4 2.3 0.0 3.3 -2.3
5 2.3 1.0 3.3 -1.3
6 3.3 3.7 4.0 0.4
> examda$ExamDiff<-examda$Exam.2 - examda$Exam.1
> examda
Exam.1 Exam.2 Quiz ExamDiff
1 2.0 3.3 4.0 1.3
2 3.3 NA 4.0 NA
3 4.0 4.0 4.0 0.0
4 2.3 0.0 3.3 -2.3
5 2.3 1.0 3.3 -1.3
6 3.3 3.7 4.0 0.4
3. 合并数据框
merge(x,y) 合并数据框。
如果这两个数据框都有某几个变量,那么将共同变量的共同观测合并;如果这两个数据框的变量值相同但变量名不同,则需要设置参数by.x 和by.y
> kids<-c("Jack","Jill","John")
> ages<-c(12,10,15)
> d1<-data.frame(kids,ages,stringsAsFactors = F)
> d1
kids ages
1 Jack 12
2 Jill 10
3 John 15
> kids<-c("Jill","Jack","Lillian")
> states<-c("CA","MA","HI")
> d2<-data.frame(kids,states,stringsAsFactors = F)
> d2
kids states
1 Jill CA
2 Jack MA
3 Lillian HI
> merge(d1,d2) ####合并数据框,其结果是合并两个数据集都有的变量
kids ages states
1 Jack 12 MA
2 Jill 10 CA
> pals<-c("Jill","Jack","Lillian")
> states<-c("CA","MA","HI")
> d3<-data.frame( pals,states,stringsAsFactors = F)
> merge(d1,d3,by.x="kids",by.y = "pals")
kids ages states
1 Jack 12 MA
2 Jill 10 CA
4.lapply() 、sapply()应用于数据框
> d1
kids ages
1 Jack 12
2 Jill 10
3 John 15
> d2<-lapply(d1,sort) ####sort是升序排列
> d2
$kids
[1] "Jack" "Jill" "John"
$ages
[1] 10 12 15
> as.data.frame(d2) ####强制转化成数据框,但是这样是没有意义的,丢失了名字和年龄的对应关系
kids ages
1 Jack 10
2 Jill 12
3 John 15
一个小例子:应用Logistic模型
####用高度、重量、环数等8个变量中的一个来预测性别
aba<-read.csv("C:/Users/NANRUN/Desktop/abalone.csv")
abamf<-aba[aba$Sex != "I",]###删掉幼鱼的观测
abamf$Sex<-ifelse(abamf$Sex=="M",1,0)
lftn<-function(clmn){
glm(abamf$Sex ~ clmn,family=binomial)$coef###Logistic模型
}
loall<-sapply(abamf[,-1],lftn)###对除了性别这一列的数据使用lftn函数