第 11 章 tidyverse中的若干技巧

聊聊tidyverse中常用的一些小技巧

“most of data science is counting, and sometimes dividing” — Hadley Wickham

11.1 From gather() to pivot()

make data tidy

VARIABLE, OBSERVATION, VALUE

  • Each variable is a column
  • Each observation is a row
  • Each type of observational unit is a table

大家想想,

  • 把植物高度大于或等于0.8cm的筛选出来,怎么写语句?
  • 用不同的颜色画出两种植物生长曲线,怎么写语句?

想用上面的语句,数据就得变形。那么怎么变形呢?

从2019年9月份,tidyr 1.0.0新增了一组函数pivot_longer()/pivot_wider(),用来补充和完善原来的gather()/spread()

  • gather()/pivot_longer it makes “wide” data longer.
  • spread()/pivot_wider it makes “long” data wider.

所以现在使用pivot_longer()函数

11.2 count()

我之前多次用到count()函数,其功能就是统计某个变量中各组出现的次数

如果用之前讲的group_by() + summarise()来写,

count() 还有更多强大的参数, 比如

如果不用count(),用group_by() + summarise()写,

当然,count()在特定场合下的简便写法,遇到复杂的分组统计,还是得用用group_by() + summarise()组合。

11.3 在 count() 中创建新变量

可以在count()里构建新变量,并利用这个新变量完成统计

11.4 add_count()

想增加一列,代表每人参加的考试次数

可以有更简单的方法

11.5 nth(), first(), last()

## [1] "a"
## [1] "k"
## [1] "d"
## [1] "a"
## [1] "k"

用在数据框中,同样可以使用

11.6 列变量重新排序

比如想把score放在第一列

这个方法,对列变量较多的情形非常适用。

11.7 if_else

11.8 case_when

11.9 找出前几名

11.10 drop_na()

11.11 replace_na()

之前讲正则表达式也有类似的函数stringr::str_replace_na()

11.12 coalesce

有时候,我们可能为了减少信息丢失,想填充NA

11.13 summarise() 生成 list-column

summarize()会生成一个value,

summarize()也可以生成一个list,

以下两种方法,同样完成上面的工作,具体方法会在第 18 章介绍

11.15 scale_x/y_log10

现实世界很多满足对数规则

  • 各国人均GDP
  • 各国人口
  • 不同人士的收入
  • 公司的营业额

11.17 unite

当然,简单的情况也可以用mutate()实现

11.18 separate()

如果用mutate()来实现,语句就会比较复杂些

如果每行不是都恰好分隔成两部分呢?就需要tidyr::extract(), 使用方法和tidyr::separate()类似

11.19 extract()

有时候分隔符搞不定的,可以用正则表达式,讲捕获的每组弄成一列

11.20 crossing()

先看看效果

这个函数在数据模拟的时候很方便,

再来一个例子

也可用在较复杂的模拟,比如下面介绍的大数极限定理

数值模拟我们会在第 13 章专门介绍。