前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于data.table的“tidyverse”?

基于data.table的“tidyverse”?

作者头像
医学和生信笔记
发布2022-11-15 10:52:41
4330
发布2022-11-15 10:52:41
举报
文章被收录于专栏:医学和生信笔记

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 医学和生信笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 一般使用
  • 分组汇总
  • 支持tidyselect
  • 支持data.table语法
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档