gpt4 book ai didi

r - data.table 相当于 tidyr::complete with group_by

转载 作者:行者123 更新时间:2023-12-02 01:06:59 24 4
gpt4 key购买 nike

我有以下数据框:

library(tidyverse)
df <- data_frame(
id = c(1, 1, 2, 2),
date1 = as.Date(c("2013-01-01", "2013-02-01", "2015-04-01", "2015-05-01")),
date2 = as.Date(c("2012-12-09", "2012-12-09", "2015-03-10", "2015-03-10"))
)

# A tibble: 4 x 3
id date1 date2
<dbl> <date> <date>
1 1 2013-01-01 2012-12-09
2 1 2013-02-01 2012-12-09
3 2 2015-04-01 2015-03-10
4 2 2015-05-01 2015-03-10

我想完成这个数据框,这样对于每个 id ,都会有另一个 date1 值。这另一个 date1 值计算为下个月。还有一个 date2 值对于所有 id 都是相同的。使用 tidyr::complete 这个 Action 可以这样完成:
df %>% 
group_by(id) %>%
complete(date1 = seq.Date(from = min(date1), length.out = 3, by = "month"), date2 = date2[1])

# A tibble: 6 x 3
# Groups: id [2]
id date1 date2
<dbl> <date> <date>
1 1 2013-01-01 2012-12-09
2 1 2013-02-01 2012-12-09
3 1 2013-03-01 2012-12-09
4 2 2015-04-01 2015-03-10
5 2 2015-05-01 2015-03-10
6 2 2015-06-01 2015-03-10

由于我的原始数据中有大约 150K 组,因此 tidyr 解决方案需要一个多小时才能完成。我假设使用 data.table 可以提高速度。在 data.table 中可以做同样的事情吗?

data.table equivalent of tidyr::complete() 中也有类似的问题,但没有 group_by 子句。

最佳答案

基于一些初始基准测试,data.table 方法似乎更快

library(data.table)
setDT(df)[, .(date1 = seq(min(date1), length.out = 3, by = 'month'), date2 = date2[1]), id]

基准
 df <- data_frame(
id = rep(1:3000, each = 2),
date1 = rep(as.Date(c("2013-01-01", "2013-02-01", "2015-04-01", "2015-05-01")),
length.out = 6000),
date2 = rep(as.Date(c("2012-12-09", "2012-12-09", "2015-03-10", "2015-03-10")),
length.out = 6000))

system.time({
df %>%
group_by(id) %>%
complete(date1 = seq.Date(from = min(date1),
length.out = 3, by = "month"), date2 = date2[1])
})
#user system elapsed
#64.05 21.27 86.05

system.time({
setDT(df)[, .(date1 = seq(min(date1), length.out = 3, by = 'month'), date2 = date2[1]), id]
})
#user system elapsed
# 0.14 0.00 0.14

关于r - data.table 相当于 tidyr::complete with group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47095292/

24 4 0