【发布时间】:2018-04-16 03:46:37
【问题描述】:
我有以下数据框:
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,可以这样操作:
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.tablesetDT(df)[, .(date1 = seq(min(date1), length.out = 3, by = 'month'), date2 = date2[1]), id] -
在此处查看@Uwe 的答案stackoverflow.com/questions/46330683/…
标签: r data.table