基于data.table的“tidyverse”?

2022-11-15 10:52:41 浏览数 (1)

tidyverse作为R语言数据分析中的瑞士军刀,非常好用,一个小小的缺点就是速度慢,data.table速度快,所以他们团队又开发了dtplyr,加快运行速度。

不过今天要介绍的是另一个,基于data.tabletidyversetidytable

使用起来非常简单,只需要在原有函数后面加一个.即可!!!

下面是一个常见操作的简单的速度对比,可以看到速度提升了非常多~

image-20220722204251999

安装

代码语言:javascript复制
# 经典2选1
install.packages("tidytable")

# install.packages("devtools")
devtools::install_github("markfairbanks/tidytable")

一般使用

只要在函数后面加一个.就可以了!!

代码语言:javascript复制
library(tidytable)
代码语言:javascript复制
## Warning: package 'tidytable' was built under R version 4.2.1
代码语言:javascript复制
## 
## Attaching package: 'tidytable'
代码语言:javascript复制
## The following object is masked from 'package:stats':
## 
##     dt
代码语言:javascript复制
df <- data.table(x = 1:3, y = 4:6, z = c("a", "a", "b"))

df %>%
  select.(x, y, z) %>%
  filter.(x < 4, y > 1) %>%
  arrange.(x, y) %>%
  mutate.(double_x = x * 2,
          x_plus_y = x   y)
代码语言:javascript复制
## # A tidytable: 3 × 5
##       x     y z     double_x x_plus_y
##   <int> <int> <chr>    <dbl>    <int>
## 1     1     4 a            2        5
## 2     2     5 a            4        7
## 3     3     6 b            6        9

分组汇总

group_by()稍有不同,这里需要使用.by = 进行分组汇总。

代码语言:javascript复制
df %>%
  summarize.(avg_x = mean(x),
             count = n(),
             .by = z) # 分组汇总形式不同
代码语言:javascript复制
## # A tidytable: 2 × 3
##   z     avg_x count
##   <chr> <dbl> <int>
## 1 a       1.5     2
## 2 b       3       1

每次都要调用:

代码语言:javascript复制
df <- data.table(x = c("a", "a", "a", "b", "b"))

df %>%
  slice.(1:2, .by = x) %>% # .by
  mutate.(group_row_num = row_number(), .by = x) # .by
代码语言:javascript复制
## # A tidytable: 4 × 2
##   x     group_row_num
##   <chr>         <int>
## 1 a                 1
## 2 a                 2
## 3 b                 1
## 4 b                 2

支持tidyselect

常见的everything(), starts_with(), ends_with(), any_of(), where()等都是支持的。

代码语言:javascript复制
df <- data.table(
  a = 1:3,
  b1 = 4:6,
  b2 = 7:9,
  c = c("a", "a", "b")
)

df %>%
  select.(a, starts_with("b"))
代码语言:javascript复制
## # A tidytable: 3 × 3
##       a    b1    b2
##   <int> <int> <int>
## 1     1     4     7
## 2     2     5     8
## 3     3     6     9
代码语言:javascript复制
df %>%
  select.(-a, -starts_with("b"))
代码语言:javascript复制
## # A tidytable: 3 × 1
##   c    
##   <chr>
## 1 a    
## 2 a    
## 3 b

可以和.by连用:

代码语言:javascript复制
df <- data.table(
  a = 1:3,
  b = c("a", "a", "b"),
  c = c("a", "a", "b")
)

df %>%
  summarize.(avg_a = mean(a), 
             .by = where(is.character))
代码语言:javascript复制
## # A tidytable: 2 × 3
##   b     c     avg_a
##   <chr> <chr> <dbl>
## 1 a     a       1.5
## 2 b     b       3

支持data.table语法

借助dt()函数实现对data.table语法的支持。

代码语言:javascript复制
df <- data.table(x = 1:3, y = 4:6, z = c("a", "a", "b"))

df %>%
  dt(, .(x, y, z)) %>%
  dt(x < 4 & y > 1) %>%
  dt(order(x, y)) %>%
  dt(, double_x := x * 2) %>%
  dt(, .(avg_x = mean(x)), by = z)
代码语言:javascript复制
## # A tidytable: 2 × 2
##   z     avg_x
##   <chr> <dbl>
## 1 a       1.5
## 2 b       3

基本上tidyverse中和数据分析有关的函数都可以使用,详细支持的函数列表大家可以在这里[1]找到。

参考资料

[1]

tidytable支持的函数: https://markfairbanks.github.io/tidytable/reference/index.html

0 人点赞