作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(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依旧会取长补短,一直前进。
原文作者:;如有侵权,请联系管理员删除。