【发布时间】:2018-08-26 23:50:06
【问题描述】:
我在 R 的 tibble 中有一个数据集,如下所示:
# A tibble: 50,045 x 5
ref_key start_date end_date
<chr> <date> <date>
1 123 2010-01-08 2010-01-13
2 123 2010-01-21 2010-01-23
3 123 2010-03-10 2010-04-14
我需要创建另一个 tibble,每行只存储一个日期,如下所示:
ref_key date
<chr> <date>
1 123 2010-01-08
2 123 2010-01-09
3 123 2010-01-10
4 123 2010-01-11
5 123 2010-01-12
6 123 2010-01-13
7 123 2010-01-21
8 123 2010-01-22
9 123 2010-01-23
目前我正在为此编写一个显式循环,如下所示:
for (loop in (1:nrow(input.df))) {
if (loop%%100==0) {
print(paste(loop,'/',nrow(input.df)))
}
temp.df.st00 <- input.df[loop,] %>% data.frame
temp.df.st01 <- tibble(ref_key=temp.df.st00[,'ref_key'],
date=seq(temp.df.st00[,'start_date'],
temp.df.st00[,'end_date'],1))
if (loop==1) {
output.df <- temp.df.st01
} else {
output.df <- output.df %>%
bind_rows(temp.df.st01)
}
}
它正在工作,但速度很慢,因为我有超过 50k 行要处理,完成循环需要几分钟。
不知道这一步能不能向量化,是不是和dplyr中的row_wise有关系?
【问题讨论】:
-
我会选择
library(data.table) ; setDT(input.df)[, .(ref_key, seq.int(start_date, end_date, by = "day")), by = 1:nrow(input.df)]
标签: r date for-loop dplyr vectorization