将R的dplyr中每行的“扩展日期范围”矢量化
我有一个tibble in R中的数据集,如下所示:将R的dplyr中每行的“扩展日期范围”矢量化,r,date,for-loop,dplyr,vectorization,R,Date,For Loop,Dplyr,Vectorization,我有一个tibble in R中的数据集,如下所示: # 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 ref_key date
# 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
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
我需要创建另一个TIBLE,每行只存储一个日期,如下所示:
# 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
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中的行有关?我们在列中创建一个行名称列rownames\u,然后嵌套“rn”和“ref\u键”,通过在映射中选择“开始日期”和“结束日期”的顺序进行变异,并在选择不需要的列后取消“最新”
library(tidyverse)
res <- df1 %>%
rownames_to_column('rn') %>%
nest(-rn, -ref_key) %>%
mutate(date = map(data, ~ seq(.x$start_date, .x$end_date, by = "1 day"))) %>%
select(-data, -rn) %>%
unnest
head(res, 9)
# ref_key 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
我们创建一个行名列rownames\u to\u column,然后嵌套'rn'和'ref\u key',通过在map中选择'start\u date'和'end\u date'序列进行变异,并在选择不需要的列后取消nest
library(tidyverse)
res <- df1 %>%
rownames_to_column('rn') %>%
nest(-rn, -ref_key) %>%
mutate(date = map(data, ~ seq(.x$start_date, .x$end_date, by = "1 day"))) %>%
select(-data, -rn) %>%
unnest
head(res, 9)
# ref_key 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
一种解决方案是使用tidyr::complete展开行。由于行扩展基于行的开始日期和结束日期,因此按行编号分组将有助于生成开始日期和结束日期之间的日期序列
资料
一种解决方案是使用tidyr::complete展开行。由于行扩展基于行的开始日期和结束日期,因此按行编号分组将有助于生成开始日期和结束日期之间的日期序列
资料
相关:;我会选择librarydata.table;setDTinput.df[,.ref_key,seq.intstart_date,end_date,by=day,by=1:nrowinput.df]相关:;我会选择librarydata.table;setDTinput.df[,.ref_key,seq.intstart_date,end_date,by=day,by=1:nrowinput.df]