R 学习笔记(4) -- 数据框


数据框是列表的一种特例,可以看成是每个组件都是长度相同的向量的列表。数据框有类似列表的特性,也有类似矩阵的特性。

创建数据框

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"

但这个例子破坏了名字和年龄之间的对应关系,没有意义,仅为示例。


读古人的书,一方面要知道古人聪明到怎样,一方面也要知道古人傻到怎样。--胡适

推荐阅读更多精彩内容