tidyverse
作为R语言数据分析中的瑞士军刀,非常好用,一个小小的缺点就是速度慢,data.table
速度快,所以他们团队又开发了dtplyr
,加快运行速度。
不过今天要介绍的是另一个,基于data.table
的tidyverse
:tidytable
。
使用起来非常简单,只需要在原有函数后面加一个.
即可!!!
下面是一个常见操作的简单的速度对比,可以看到速度提升了非常多~
image-20220722204251999
安装
代码语言:javascript复制# 经典2选1
install.packages("tidytable")
# install.packages("devtools")
devtools::install_github("markfairbanks/tidytable")
一般使用
只要在函数后面加一个.
就可以了!!
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 =
进行分组汇总。
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()
等都是支持的。
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
连用:
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
语法的支持。
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