数据框是列表的一种特例,可以看成是每个组件都是长度相同的向量的列表。数据框有类似列表的特性,也有类似矩阵的特性。
创建数据框
data.frame() 函数:
> kids
[1] "Jack" "Jill"
> ages
[1] 12 10
> # stringsAsFactors=FALSE 参数相当于 as.is=TRUE
> # options() 函数可以设置全局 stringsAsFactors 选项
> d <- data.frame(kids,ages,stringsAsFactors=FALSE)
> d
kids ages
1 Jack 12
2 Jill 10
> str(d)
'data.frame': 2 obs. of 2 variables:
$ kids: chr "Jack" "Jill"
$ ages: num 12 10
> # 不同的访问数据框的列的方式,有列表的方式和矩阵的方式
> d[[1]]
[1] "Jack" "Jill"
> d$kids
[1] "Jack" "Jill"
> d[,1]
[1] "Jack" "Jill"
提取子集
数据框提取子集的方法可以用类似矩阵取子集的方式,也可以用矩阵的方式进行筛选。
缺失值(NA)的去除可以用 na.rm=TREU 。
subset() 函数取子集,默认去除缺失值 NA,更方便。
从数据框中去除包含缺失值的观测,可以利用 complete.case() 函数简化操作,complet.case() 函数检测每一行是否包含 NA 生成一个布尔型向量。
rbind() 和 cbind() 函数也可以用来给数据框增加行和列。
合并数据框
merge() 函数,类似关系型数据库中根据某个共同变量合并两个表,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
> d <- merge(d1,d2)
> d
kids states ages
1 Jack CA 12
2 Jill MA 10
> # 共同变量有重复值,用 merge() 合并出现错误
> d2a <- rbind(d2,list(15,"Jill"))
> d2a
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
4 15 Jill
> merge(d1,d2a)
kids states ages
1 Jack CA 12
2 Jill MA 10
3 Jill MA 15
如果共同变量在其中一个数据框中有重复值,用 merge() 合并可能出现错误。
对数据框使用 lapply() 函数
数据框是列表的一种特例,也可以应用 lapply() 函数。
> d2
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
> d3 <- lapply(d2,sort)
> d3
$ages
[1] 7 10 12
$kids
[1] "Jack" "Jill" "Lillian"
但这个例子破坏了名字和年龄之间的对应关系,没有意义,仅为示例。
读古人的书,一方面要知道古人聪明到怎样,一方面也要知道古人傻到怎样。--胡适