第 12 章 简单数据框

12.1 tidyverse 家族

前面陆续介绍了tidyverse家族,家庭主要成员包括

功能 宏包
有颜值担当 ggplot2
数据处理王者 dplyr
数据转换专家 tidyr
数据载入利器 readr
循环加速器 purrr
强化数据框 tibble

12.2 人性化的tibble

  • tibble是用来替换data.frame类型的扩展的数据框
  • tibble继承了data.frame,是弱类型的。换句话说,tibble是data.frame的子类型
  • tibble与data.frame有相同的语法,使用起来更方便
  • tibble更早的检查数据,方便写出更干净、更多富有表现力的代码

tibble对data.frame做了重新的设定:

  • tibble,不关心输入类型,可存储任意类型,包括list类型
  • tibble,没有行名设置 row.names
  • tibble,支持任意的列名
  • tibble,会自动添加列名
  • tibble,类型只能回收长度为1的输入
  • tibble,会懒加载参数,并按顺序运行
  • tibble,是tbl_df类型

12.3 tibble 与 data.frame

传统创建数据框

发现,data.frame()会自动将字符串型的变量转换成因子型,如果想保持原来的字符串型,就得

用tibble创建数据框,不会这么麻烦,输出的就是原来的字符串类型

我们有时候喜欢这样,构建两个有关联的变量, 比如

但是,如果用传统的data.frame()来构建,会报错

## Error in x + 2: 二进列运算符中有非数值参数

因此,在这一点上tibble()做的比较人性化。

大家还可以发现tibble另一个优势:tibble输出时,会显示多一行,用来指定每一列的类型。

tibble用缩写定义了7种类型:

类型 含义
int 代表integer
dbl 代表double
chr 代表character向量或字符串
dttm 代表日期+时间(date+time)
lgl 代表逻辑判断TRUE或者FALSE
fctr 代表因子类型factor
date 代表日期dates

12.4 tibble数据操作

12.4.1 创建tibble

tibble()创建一个tibble类型的data.frame:

刚才提到了,可以这样,

  • 为了让每列更加直观,也可以tribble()创建,数据量不大的时候,挺方便的

12.4.2 转换成tibble类型

转换成tibble类型意思就是说,刚开始不是tibble, 现在转换成tibble, 包括

  • data.frame转换成tibble
  • vector转换成tibble
  • list转换成tibble
  • matrix转换成tibble

12.4.2.1 data.frame转换成tibble

## [1] "data.frame"

12.4.2.2 vector转型到tibble

12.4.2.3 把list转型为tibble

把tibble再转为list? as.list(df)

12.4.2.4 把matrix转型为tibble。

tibble转回matrix? as.matrix(df)

12.4.3 tibble简单操作

构建一个简单的数据框

增加一列

增加一行

在第二行,增加一行

12.4.4 有用的函数lst

lst,创建一个list,具有tibble特性的list。

## $n
## [1] 5
## 
## $x
## [1] 0.07026 0.31256 0.47827 0.65139 0.63499
## 
## $y
## [1] TRUE

12.4.5 有用的函数enframe

enframe()将矢量快速创建tibble,,创建的tibble只有2列: name和value

12.4.6 有用的函数deframe

deframe()可以看做是enframe() 的反操作,把tibble反向转成向量

## a b 
## 5 7

12.4.7 读取文件

read_csv()读取文件时,生成的直接就是tibble

12.5 关于行名

data.frame是支持行名的,但tibble不支持行名,这也是两者不同的地方

## [1] TRUE

但是对于tibble

需要注意的:

  • 有时候遇到含有行名的data.frame,转换成tibble后,行名会被丢弃
  • 如果想保留行名,就需要把行名转换成单独的一列

举个例子

12.6 修复列名

规范的来说,数据框的列名应该是唯一。但现实中代码是人写的,因此可能会稀奇古怪的,所幸的是tibble也提供了人性化的解决方案

## Error: Column name `x` must not be duplicated.
## Use .name_repair to specify repair.
  • .name_repair = "check_unique" 检查列名唯一性,但不做修复(默认)

  • .name_repair = "minimal", 不检查也不修复,维持现状

  • .name_repair = "unique" 修复列名,使得列名唯一且不为空

  • .name_repair = "universal" 修复列名,使得列名唯一且语法可读

具体使用方法:

如果认为x...1, x...2 不符合自己的审美,可以指定修复函数

注意make.unique(names, sep = ".")make.names(names, unique = FALSE, allow_ = TRUE) 是基础包的函数,可通过?make.unique()或者make.names()获取说明文档。

当然也可以自定义函数

  • 感觉越说越复杂了,事实上,我们写数据框的时候,完全可以避免上述问题,只要做到规范列名。
  • 如果真正遇到比较乱的列名,推荐使用janitor::clean_names()一步到位。

12.7 nested tibble

nested tibbleList-columns (列表列) 会在后面的章节详细介绍。

12.8 延伸阅读

1、阅读Hadley Wickham的r4ds这本书第10章

2、 tibble的官方主页:https://tibble.tidyverse.org/

3、创建列表列的方法,可以参考nested tibblelist-columns