【问题标题】:Fill in missing date ranges填写缺失的日期范围
【发布时间】:2018-07-04 12:47:11
【问题描述】:

我有以下示例数据框:

Date_from <- c("2013-01-01","2013-01-10","2013-01-16","2013-01-19")
Date_to <- c("2013-01-07","2013-01-12","2013-01-18","2013-01-25")
y <- data.frame(Date_from,Date_to)
y$concentration <- c("1.5","2.5","1.5","3.5")
y$Date_from <- as.Date(y$Date_from)
y$Date_to <- as.Date(y$Date_to)
y$concentration <- as.numeric(y$concentration)

这些是在特定日期范围内测得的重金属浓度。但是,日期范围不连续,因为 2013-01-07 到 2013-01-10 和 2013-01-12 到 2013-01-16 之间存在间隔。我需要检测这些间隙,在每个间隙后插入一行并用缺失的范围填充它。结果应如下所示:

Date_from    Date_to concentration
2013-01-01 2013-01-07           1.5
2013-01-08 2013-01-09            NA
2013-01-10 2013-01-12           2.5
2013-01-13 2013-01-15            NA
2013-01-16 2013-01-18           1.5
2013-01-19 2013-01-25           3.5

【问题讨论】:

    标签: r date


    【解决方案1】:

    试试这个:

    adding <- data.frame(Date_from = y$Date_to[-nrow(y)]+1,
                         Date_to = y$Date_from[-1]-1, concentration = NA)
    adding <- adding[adding$Date_from <= adding$Date_to,]
    res <- rbind(y,adding)
    res[order(res$Date_from),]
    
    #   Date_from    Date_to concentration
    #1 2013-01-01 2013-01-07           1.5
    #5 2013-01-08 2013-01-09            NA
    #2 2013-01-10 2013-01-12           2.5
    #6 2013-01-13 2013-01-15            NA
    #3 2013-01-16 2013-01-18           1.5
    #4 2013-01-19 2013-01-25           3.5
    

    【讨论】:

    • 我已经在一个新问题中发布了这个,但我想知道我是否应该在这里:如何进一步检测数据框中的最后一天(Date_to),如果这不是最后一天年度(2013 年 12 月 31 日)添加另一行缺少最后一个日期范围并添加 NA 以表示浓度?
    • 我刚刚使用另一个数据框检查了您的代码,但它似乎不适用于仅缺少 1 天的情况,例如 2013-01-01 to 2013-01-06 和 2013-01-08 to 2013-01-09 存在但 2013-01-07 to 2013-01-07 缺失。
    • 查看编辑。我刚刚在第二行将&lt; 更改为&lt;=。
    【解决方案2】:

    这是一个需要magrittr 和dplyr 的解决方案。它会找到空隙,然后循环填充它们。

    # Locations to pad data frame
    tmp <- which(y$Date_from-lag(y$Date_to) > 1) 
    tmp <- tmp + (1:length(tmp)) - 1
    
    for(i in tmp) {
      # Add row
      y %<>% add_row(Date_from = y$Date_to[i-1] + 1, 
                     Date_to = y$Date_from[i] - 1, 
                     .before = i)
    }
    
    #    Date_from    Date_to concentration
    # 1 2013-01-01 2013-01-07           1.5
    # 2 2013-01-08 2013-01-09            NA
    # 3 2013-01-10 2013-01-12           2.5
    # 4 2013-01-13 2013-01-15            NA
    # 5 2013-01-16 2013-01-18           1.5
    # 6 2013-01-19 2013-01-25           3.5
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2015-01-14
      • 2018-06-24
      • 2011-04-02
      • 1970-01-01
      • 2018-10-05
      • 2019-06-26
      相关资源
      最近更新 更多