查看原文
其他

基于data.table的“tidyverse”?

阿越就是我 医学和生信笔记 2023-06-15
关注公众号,发送R语言python,可获取资料

💡专注R语言在🩺生物医学中的使用


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

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

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

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

image-20220722204251999

安装

# 经典2选1
install.packages("tidytable")

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

一般使用

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

library(tidytable)
## Warning: package 'tidytable' was built under R version 4.2.1
## 
## Attaching package: 'tidytable'
## The following object is masked from 'package:stats':
## 
##     dt
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)
## # 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 = 进行分组汇总。

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

每次都要调用:

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
## # 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()等都是支持的。

df <- data.table(
  a = 1:3,
  b1 = 4:6,
  b2 = 7:9,
  c = c("a""a""b")
)

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

可以和.by连用:

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))
## # 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语法的支持。

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)
## # 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





获取更多信息,欢迎加入🐧QQ交流群:613637742


医学和生信笔记,专注R语言在临床医学中的使用、R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。


往期回顾




使用 aplot “拼”一个热图


ggplot2版本的热图-方便拼图!


迄今为止最强大的upset plot R包,没有之一!


韦恩图进阶!upset plot 01


gt包绘制表格详细介绍!


使用compareGroups包1行代码生成基线资料表


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存