计算R中日期之间的最有效方法是什么?

时间:2017-04-23 22:26:31

标签: r

我有一个大型数据集(作为csv),并希望计算日期之间的时间。最有效的方法是什么? 例如,数据:

ID    start        end
01    01-04-2017   05-04-2017
01    04-04-2017   06-04-2017
01    11-04-2017   21-04-2017
02    19-05-2017   22-05-2017
02    22-05-2017   24-05-2017
02    02-06-2017   05-06-2017
02    09-06-2017   12-06-2017
...

这不是那么简单,因为可能存在重叠 - 如上所示。

我想要的输出是:

ID    time
01    15
02    11
...

我考虑过根据ID(split(dataframe(df$start, df$end), df$ID))将数据拆分成一个列表,但这对于大型数据帧来说速度很慢。我也考虑过循环df并比较差异,但这也很慢。 在R中有没有一种有效的方法呢?

1 个答案:

答案 0 :(得分:0)

您可以使用findInterval来检查end的每个值所属的开始日期间隔。如果它们重叠,则两个具有相同的间隔,可用于分组和聚合以消除重叠:

library(dplyr)

df <- read.table(text = 'ID    start        end
01    01-04-2017   05-04-2017
01    04-04-2017   06-04-2017
01    11-04-2017   21-04-2017
02    19-05-2017   22-05-2017
02    22-05-2017   24-05-2017
02    02-06-2017   05-06-2017
02    09-06-2017   12-06-2017', header = TRUE, colClasses = 'character') %>% 
    mutate_at(-1, as.Date, format = '%d-%m-%Y')    # parse dates

df_aggregated <- df %>% 
    group_by(ID) %>% 
    group_by(ID, overlap = findInterval(end, start)) %>% 
    summarise(start = min(start), end = max(end)) %>% 
    select(-overlap) %>% ungroup()    # clean up

df_aggregated
#> # A tibble: 5 × 3
#>      ID      start        end
#>   <chr>     <date>     <date>
#> 1    01 2017-04-01 2017-04-06
#> 2    01 2017-04-11 2017-04-21
#> 3    02 2017-05-19 2017-05-24
#> 4    02 2017-06-02 2017-06-05
#> 5    02 2017-06-09 2017-06-12

数据整理后,总结很简单:

df_aggregated %>% group_by(ID) %>% summarise(span = sum(end - start))
#> # A tibble: 2 × 2
#>      ID    span
#>   <chr>  <time>
#> 1    01 15 days
#> 2    02 11 days

此方法假设每个组按start排序;如果没有,请添加arrange(start)

相关问题