ITPub博客

首页 > > > dplyr 1.0.0新特性?tidyfst早就有了...

dplyr 1.0.0新特性?tidyfst早就有了...

作者:浪花小雨滴 时间:2020-03-21 08:26:04 0 删除 编辑

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言数据高效处理指南》。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。

昨天突然了解到dplyr 1.0.0开始介绍其新的特性(dplyr 1.0.0: new `summarise()` features - Tidyverse),非常兴奋,想要给tidyfst补充一点让新特性也加进来。结果一尝试发现,非常尴尬,这个特性从tidyfst诞生以来,就一直能用...这不能怪我,只能怪data.table太灵活。

下面,我演示一些例子,dplyr的用户可以参照着最新特性来比较,但是dplyr还没有升级到1.0.0的用户就不要着急,先试tidyfst的代码:

library(tidyfst)
#> 
#> Life's short, use R.

df <- data.table(
  grp = rep(1:2, each = 5), 
  x = c(rnorm(5, -0.25, 1), rnorm(5, 0, 1.5)),
  y = c(rnorm(5, 0.25, 1), rnorm(5, 0, 0.5))
)
df
#>       grp          x           y
#>     <int>      <num>       <num>
#>  1:     1 -0.5775110  2.30178761
#>  2:     1 -0.1699714 -0.02226965
#>  3:     1 -0.4631597  0.69311083
#>  4:     1  0.1711564  1.18539347
#>  5:     1 -0.8515569 -0.78980764
#>  6:     2  2.0374649 -0.19481605
#>  7:     2 -2.2715893  0.14587900
#>  8:     2  0.2572441 -0.26926262
#>  9:     2  1.7451391 -0.03871205
#> 10:     2  0.2988812 -0.40036918

df %>% 
  summarise_dt(rng = range(x),by = grp)
#>      grp        rng
#>    <int>      <num>
#> 1:     1 -0.8515569
#> 2:     1  0.1711564
#> 3:     2 -2.2715893
#> 4:     2  2.0374649

df %>% 
  summarise_dt(min = min(x), mean = mean(x),by = grp)
#>      grp        min       mean
#>    <int>      <num>      <num>
#> 1:     1 -0.8515569 -0.3782085
#> 2:     2 -2.2715893  0.4134280

df %>% 
  summarise_dt(by = grp,
               x = quantile(x, c(0.25, 0.5, 0.75)), 
               q = c(0.25, 0.5, 0.75))
#>      grp          x     q
#>    <int>      <num> <num>
#> 1:     1 -0.5775110  0.25
#> 2:     1 -0.4631597  0.50
#> 3:     1 -0.1699714  0.75
#> 4:     2  0.2572441  0.25
#> 5:     2  0.2988812  0.50
#> 6:     2  1.7451391  0.75

就真的直接能用了,除了分组直接用了summarise_dt里面的by参数,不需要先分组,其他语法基本没有任何区别。

唯一一点不同的是,按照博客例子中,新的dplyr对于返回一个数据框列表的情况,会直接unnest然后给出结果。这种“非法”操作只在list-column中有,也是严格限定的。为了速度,tidyfst可能不会把这个特性加进来,但是实现起来依旧不难:

quibble <- function(x, q = c(0.25, 0.5, 0.75)) {
  data.table(x = quantile(x, q), q = q)
}

df %>% summarise_dt(
  by = grp,
  ndt = list(quibble(x))
) %>%  unnest_dt(ndt)
#>      grp          x     q
#>    <int>      <num> <num>
#> 1:     1 -0.5775110  0.25
#> 2:     1 -0.4631597  0.50
#> 3:     1 -0.1699714  0.75
#> 4:     2  0.2572441  0.25
#> 5:     2  0.2988812  0.50
#> 6:     2  1.7451391  0.75

先来一个list包住,然后再unnest_dt即可。这里我决定不搞“懒人经济”,希望大家多了解一点list的使用方法,还有unnest的概念(因为这个性能如果让我来简化,目前会损失速度,tidyfst要的是最简洁易懂的语法和最快的速度,不得已就要做两者之间的权衡)。其实我已经去看过dplyr 1.0.0的特性,tidyfst依旧会取长补短,一直前进。

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40005