r - 获取多个日期间隔的 No_intersection/Complementary 部分

标签 r

我想获取 2017 年几个日期间隔中缺失的部分。

例如,以下数据帧的每个“id”:

df <- data.frame(id=c(rep("a",3),rep("b",2)),
                 start=c("2017-01-01","2017-01-10","2017-02-10","2017-03-01","2017-04-20"),
                 end=c("2017-01-15","2017-01-20","2017-02-20","2017-03-28","2017-04-29"))

id    start        end 
a     2017-01-01   2017-01-15 
a     2017-01-10   2017-01-20
a     2017-02-10   2017-02-20
b     2017-03-01   2017-03-28
b     2017-04-20   2017-04-29

我想要得到:

df_final <- data.frame(id=c(rep("a",2),rep("b",3)),
                       start=c("2017-01-21","2017-02-21","2017-01-01","2017-03-29","2017-04-30"),
                       end=c("2017-02-09","2017-12-31","2017-02-28","2017-04-19","2017-12-31"))

id    start        end
a     2017-01-21   2017-02-09
a     2017-02-21   2017-12-31
b     2017-01-01   2017-02-28
b     2017-03-29   2017-04-19
b     2017-04-30   2017-12-31

谢谢!

最佳答案

首先确认startend是否为Date类。

df$start <- as.Date(df$start)
df$end <- as.Date(df$end)

使用by()根据id将数据分割成两个数据框的列表。

library(purrr)

by(df, df$id, function(x){
  year <- seq(as.Date("2017-01-01"), as.Date("2017-12-31"), 1)
  ind <- map2(x$start, x$end, function(start, end){
      which(year < start | year > end)
  }) %>% reduce(intersect)
  gap <- which(diff(ind) > 1)
  head <- ind[c(1, gap + 1)] ; tail <- ind[c(gap, length(ind))]
  return(data.frame(id = unique(x$id), start = year[head], end = year[tail]))
}) %>% reduce(rbind)

描述:

  • 年份:2017 年的所有日期。
  • ind :去掉行中startend之间的日期,结果代表缺失日期的索引。<
  • 间隙:不连续的索引。

输出:

#   id      start        end
# 1  a 2017-01-21 2017-02-09
# 2  a 2017-02-21 2017-12-31
# 3  b 2017-01-01 2017-02-28
# 4  b 2017-03-29 2017-04-19
# 5  b 2017-04-30 2017-12-31

我认为我的解决方案仍然很麻烦。希望对您有帮助。

关于r - 获取多个日期间隔的 No_intersection/Complementary 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54149500/

相关文章:

r - 根据最近的日期合并数据 R

r - 在 Shiny 的 DataTable 实现中控制数字格式

r - 如何向构面标签添加上标

r - 我可以使用子 .Rmd 中的 YAML 数据作为 pagedown 文档的一级标题吗?

regex - R 中基于正则表达式的列表匹配

r - 如何将时间转换为小数

调用通过示例创建的表达式

r - Highcharts X 轴类别名称仅显示 1 个字符

r - 将 data.frame 中的列转换为日期

r - 将strsplit应用于data.frame中的特定列