首页 > 解决方案 > 有条件地在 R 中汇总日期

问题描述

嗨,我正在尝试找出一种有条件地在 R 中汇总日期的方法。

假设我有下表,并且我想使用 Flags 变量汇总日期。标志可以是 1 或 2,并指示可以链接哪些后续日期。

DateStart <- c("2018-01-01", "2018-01-04", "2018-01-05", "2018-01-09", "2018-01-12", "2018-01-20")
DateEnd <- c("2018-01-05", "2018-01-09", "2018-01-12", "2018-01-15", "2018-01-20", "2018-01-21")
IndexRecord <- c(1, NA, NA, NA, NA, NA)
Flag1 <- c(1,1,1,1,1,1)
Flag2 <- c(2,1,1,1,1,1)
Flag3 <- c(1,1,2,1,2,1)


df1 <- data.frame(DateStart = as.Date(DateStart), 
                  DateEnd = as.Date(DateEnd), 
                  IndexRecord = IndexRecord,
                  Flag1 = Flag1,
                  Flag2 = Flag2,
                  Flag3 = Flag3) %>% 
  arrange(DateStart)

df1

|   | DateStart  | DateEnd    | IndexRecord | Flag1 | Flag2 | Flag3 |
|---|------------|------------|-------------|-------|-------|-------|
| 1 | 2018-01-01 | 2018-01-05 | 1           | 1     | 2     | 1     |
| 2 | 2018-01-04 | 2018-01-09 | NA          | 1     | 1     | 1     |
| 3 | 2018-01-05 | 2018-01-12 | NA          | 1     | 1     | 2     |
| 4 | 2018-01-09 | 2018-01-15 | NA          | 1     | 1     | 1     |
| 5 | 2018-01-12 | 2018-01-20 | NA          | 1     | 1     | 2     |
| 6 | 2018-01-20 | 2018-01-21 | NA          | 1     | 1     | 1     |

当前期间的值为 1 的标志意味着要使后续行具有有效链接,后续行的 DateStart 必须在当前行的DateEnd之前出现。使用 Flag1 作为感兴趣的列,结果如下所示:

|   | DateStart  | DateEnd    | IndexRecord | Flag1 | 
|---|------------|------------|-------------|-------|
| 1 | 2018-01-01 | 2018-01-05 | 1           | 1     | 
| 2 | 2018-01-04 | 2018-01-09 | NA          | 1     | 
| 3 | 2018-01-05 | 2018-01-12 | NA          | 1     |
| 4 | 2018-01-09 | 2018-01-15 | NA          | 1     | 
| 5 | 2018-01-12 | 2018-01-20 | NA          | 1     |

当前期间的值为 2 的标志意味着要使后续行具有有效链接,后续行的 DateStart 必须出现在当前行的 DateEnd 上。使用 Flag2 作为感兴趣的列,结果将如下所示:

|   | DateStart  | DateEnd    | IndexRecord | Flag2 | 
|---|------------|------------|-------------|-------|
| 1 | 2018-01-01 | 2018-01-05 | 1           | 2     |
| 3 | 2018-01-05 | 2018-01-12 | NA          | 1     |
| 4 | 2018-01-09 | 2018-01-15 | NA          | 1     |
| 5 | 2018-01-12 | 2018-01-20 | NA          | 1     |

更复杂的情况之一可能会出现在 Flag3 中看到的模式,并获得所需的结果:

|   | DateStart  | DateEnd    | IndexRecord | Flag3 |
|---|------------|------------|-------------|-------|
| 1 | 2018-01-01 | 2018-01-05 | 1           | 1     |
| 2 | 2018-01-04 | 2018-01-09 | NA          | 1     |
| 3 | 2018-01-05 | 2018-01-12 | NA          | 2     |
| 5 | 2018-01-12 | 2018-01-20 | NA          | 2     |
| 6 | 2018-01-20 | 2018-01-21 | NA          | 1     |


干杯,

Ĵ

编辑:由于这可能不清楚,让我逐步澄清。

标志1。

  1. 我们看到,在第 1 行中,它在 2018-01-05 结束,Flag1 为 1。
  2. 这意味着对于要链接到这一集的后续行,下一集的 DateStart 必须出现在第 1 行的 DateEnd 之前。第 2 行满足此条件,因为 2018-01-04 出现在 2018-01-05 之前,因此是有效链接.
  3. 如果我们查看剩余的行,除了第 6 行之外,所有这些日期都是嵌套的。由于第 5 行的标志 1 为 1,我们无法计算第 6 行,因此表格停在第 5 行。
  4. 总经过时间是从 2018-01-01 到 2018-01-20。

标志2。

  1. 第 1 行的 Flag2 等于 2,这意味着只有 2018-01-05 的后续 DateStart 可以链接到此行。因此第 2 行被删除。如果我们继续向下移动,我们会看到第 3 行的 DateStart 为 2018-01-05,因此可以链接到第 1 行。
  2. 查看剩余的行,它与 Flag1 具有相同的模式,因为从此时起 Flag1 和 Flag2 是相同的。
  3. 与 Flag1 类似,总经过时间是从 2018-01-01 到 2018-01-20
  4. 与 Flag1 相比,经过的时间没有差异,但所走的旅程不同。

标志 3。

  1. 第 1 行和第 2 行的标志 3 与标志 1 中的相同,这意味着此时第 1 行、第 2 行和第 3 行与标志 1 示例相同。
  2. 但是,第 3 行的 Flag3 为 2。由于第 3 行的 DateEnd 为 2018-01-12,因此只能链接第 5 行,并删除第 4 行。
  3. 由于第 5 行的 Flag3 为 2,DateEnd 为 2018-01-20,因此第 6 行也可以链接到该集合。
  4. 这组的总经过时间是从 2018-01-01 到 2018-01-21。

标签: rdplyr

解决方案


推荐阅读