我有一个大型数据集(作为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中有没有一种有效的方法呢?
答案 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)
。