文章目录
一、创建数据框
一个简单的例子:
> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
kids ages
1 jack 12
2 jill 10
1、访问数据框
通过组件的索引值或者组件名来访问数据框的组件:
> d[[1]]
[1] "jack" "jill"
> d$kids
[1] "jack" "jill"
也可以通过类似矩阵的方式来访问
> d[,1] #查看第一列
[1] "jack" "jill"
用str()函数查看d的内部结构,可以看出d具有矩阵的特征
> str(d)
'data.frame': 2 obs. of 2 variables:
$ kids: chr "jack" "jill"
$ ages: num 12 10
二、其他矩阵式操作
1、提取子数据框
数据框可以看作是行和列组成的,因此可以按行或列提取子数据框,如下:
> setwd("D:/R_files/code")
> examsquiz <- read.table("exams.txt",header = TRUE)
> head(examsquiz)
Exam.1 Exam.2 Quiz
1 2.0 3.3 4.0
2 3.3 2.0 3.7
3 4.0 4.3 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,]
Exam.1 Exam.2 Quiz
2 3.3 2.0 3.7
3 4.0 4.3 4.0
4 2.3 0.0 3.3
5 2.3 1.0 3.3
> examsquiz[2:5,2]
[1] 2.0 4.3 0.0 1.0
> class(examsquiz[2:5,2])
[1] "numeric"
> examsquiz[2:5,2,drop=FALSE]
Exam.2
2 2.0
3 4.3
4 0.0
5 1.0
> class(examsquiz[2:5,2,drop=FALSE])
[1] "data.frame"
在此例中,因为examsquiz[2:5,2]是向量,R会创建一个向量而不是另一个数据框,设定参数drop=FALSE,可以得到一个一列的数据框
也可以对此做筛选:
> examsquiz[examsquiz$Exam.1>=3.8]
Quiz
1 4.0
2 3.7
3 4.0
4 3.3
5 3.3
6 4.0
2、缺失值的处理
一个小例子:
> x <- c(2,NA,4)
> mean(x)
[1] NA
> mean(x,na.rm = TRUE)
[1] 3
可以使用subset()函数,可以不用自己设定na.rm=TRUE,可以把它应用在数据框上来选择行,列名称将从给定数据框中获取
> head(examsquiz)
Exam.1 Exam.2 Quiz
1 2.0 3.3 4.0
2 3.3 2.0 3.7
3 4.0 4.3 4.0
4 2.3 0.0 3.3
5 2.3 1.0 3.3
6 3.3 3.7 4.0
> examsquiz[examsquiz$Exam.1 >= 3.8,]
Exam.1 Exam.2 Quiz
3 4 4.3 4
> subset(examsquiz,Exam.1 >= 3.8)
Exam.1 Exam.2 Quiz
3 4 4.3 4
> subset(examsquiz,examsquiz$Exam.1>=3.8)
Exam.1 Exam.2 Quiz
3 4 4.3 4
可以看出来结果都是一样的
在有些情况下,希望从数据框中去掉含有一个以上缺失值NA的观测,这时候看complete.cases()函数比较方便
> KID <- read.table("kids.txt",header = TRUE)
> KID
kids states
1 Jack CA
2 <NA> MA
3 Jillian MA
4 John <NA>
> complete.cases(KID)
[1] TRUE FALSE TRUE FALSE
> KID1 <- KID[complete.cases(KID),]
> KID1
kids states
1 Jack CA
3 Jillian MA
3、使用rbind()和cbind()等函数
矩阵函数rbind()和cbind()也同样可以应用于数据框,前提是两个数据框有相同的行数或者列数
- 用rbind()添加新行的时候,添加的行通常是数据框或者列表的形式:
> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
kids ages
1 jack 12
2 jill 10
> rbind(d,list("lau",19))
kids ages
1 jack 12
2 jill 10
3 lau 19
也可以用原来得列创建新的列,例如,增加一个表示第一门与第二门考试成绩之差得变量:
> head(examsquiz)
Exam.1 Exam.2 Quiz
1 2.0 3.3 4.0
2 3.3 2.0 3.7
3 4.0 4.3 4.0
4 2.3 0.0 3.3
5 2.3 1.0 3.3
6 3.3 3.7 4.0
> eq <- cbind(examsquiz,examsquiz$Exam.2-examsquiz$Exam.1)
> class(eq)
[1] "data.frame"
> head(eq)
Exam.1 Exam.2 Quiz examsquiz$Exam.2 - examsquiz$Exam.1
1 2.0 3.3 4.0 1.3
2 3.3 2.0 3.7 -1.3
3 4.0 4.3 4.0 0.3
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
可以看到新变量的名称过于笨拙了,可以用names()函数修改变量名称,不过最好利用数据框的列表属性,用下面的方式给原来的数据框添加一个长度相同的新列:
> examsquiz$ExamDiff <- examsquiz$Exam.2-examsquiz$Exam.1
> head(examsquiz)
Exam.1 Exam.2 Quiz ExamDiff
1 2.0 3.3 4.0 1.3
2 3.3 2.0 3.7 -1.3
3 4.0 4.3 4.0 0.3
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
数据框也可以进行循环补齐,可以向数据框添加长度不同的列:
> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
kids ages
1 jack 12
2 jill 10
> d$one <- 1
> d
kids ages one
1 jack 12 1
2 jill 10 1
4、使用apply()
如果数据框的每一列的数据类型相同,则可以会数据框使用apply()函数
> apply(examsquiz,1,max)
[1] 4.0 3.7 4.3 3.3 3.3 4.0
三、合并数据框
合并:两张表根据某个共同变量的值组合到一起
最简单的形式:merge(x,y)
> kids <- c("Jack","Jill","Jillian","John")
> states <- c("CA","MA","MA","HI")
> d1 <- data.frame(kids,states,stringsAsFactors = FALSE)
> d1
kids states
1 Jack CA
2 Jill MA
3 Jillian MA
4 John HI
> kids <- c("Jill","Lillian","Jack")
> ages <- c(10,7,12)
> d2 <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d2
kids ages
1 Jill 10
2 Lillian 7
3 Jack 12
> d <- merge(d1,d2)
> d
kids states ages
1 Jack CA 12
2 Jill MA 10
这两个数据框都有变量kids,R在两个数据框里查找kids变量值相同的行,再用查找到的行和两个数据框里的所有列然后创建新的数据框
- 函数merge()有两个参数by.x和by.y,用于标示出两个数据框里含有相同信息但名称不同的两个变量
> ages <- c(10,7,12)
> pals <- c("Jill","Lillian","Jack")
> d3 <- data.frame(pals,ages,stringsAsFactors = FALSE)
> d3
pals ages
1 Jill 10
2 Lillian 7
3 Jack 12
> merge(d1,d3,by.x="kids",by.y = "pals")
kids states ages
1 Jack CA 12
2 Jill MA 10
四、应用于数据框的函数
1、在数据框上应用lappply()和sapply()函数
数据框是列表的特例,数据框的列构成了列表的组件。在数据框上应用lapply()函数,指定函数是f()。f()函数会作用于数据框的每一列,然后将返回值置于一个列表中。
> kids <- c("jack","jill")
> ages <- c(12,10)
> d <- data.frame(kids,ages,stringsAsFactors = FALSE)
> d
kids ages
1 jack 12
2 jill 10
> dl <- lapply(d,sort)
> dl
$kids
[1] "jack" "jill"
$ages
[1] 10 12
dl是由两个向量构成的列表,这两个向量是排序后的kids和ages
but,dl现在只是列表,而不是数据框,可以把它强制转化为数据框:
> as.data.frame(dl)
kids ages
1 jack 10
2 jill 12