【问题标题】:count row if date falls within date range for all dates in series in R如果日期在 R 中所有系列日期的日期范围内,则计数行
【发布时间】:2022-02-03 04:57:19
【问题描述】:

我有一个大型数据框(约 30,000 行),其中有两个日期字段“start_date”和“end_date”。

我想总结数据,这样我有 1 列包含所有日期,第二列包含该日期在“start_date”和“end_date”之间的所有行的计数。

我可以使用 2 个 for 循环来完成这项工作,但它的效率非常低,因为它将大约 180 个日期与 30,000 行日期范围进行比较。

下面是一个例子。假设我有以下数据框。

df <- tibble(
  start_date = c(1,1,2,2,3,3,4,4,5,5),
  end_date = c(2,3,4,5,6,7,8,9,10,11)
)

我希望它输出一个看起来像这样的表/数据框

Date    Count
1       2
2       4
3       5
4       6
5       7
6       6
7       5
8       4
9       3
10      2
11      1

是否有一些 TidyVerse 函数或其他任何东西可以有效地进行这种转换?

【问题讨论】:

    标签: r date count intervals date-range


    【解决方案1】:

    这是一个基本的 R 方法:

    date = seq(min(df$start_date), max(df$end_date))
    count = sapply(date, \(x) sum(x >= df$start_date & x <= df$end_date))
    data.frame(date, count)
    #    date count
    # 1     1     2
    # 2     2     4
    # 3     3     5
    # 4     4     6
    # 5     5     7
    # 6     6     6
    # 7     7     5
    # 8     8     4
    # 9     9     3
    # 10   10     2
    # 11   11     1
    

    【讨论】:

      【解决方案2】:

      这是使用foverlapsdata.table 方法。首先,创建所需日期的sequence,从最小值start_date 到最大值end_date。然后,为每个日期创建一个简单的data.table

      使用foverlaps 获取起始data.frame 和新表之间的重叠连接。最后,统计每个日期连接后的行数。

      library(data.table)
      
      setDT(df)
      dates <- seq(min(df$start_date), max(df$end_date), by = 1)
      dt <- data.table(start_date = dates, end_date = dates, key = c("start_date", "end_date"))
      foverlaps(df, dt, which = T)[, .N, by = yid]
      

      输出

          yid N
       1:   1 2
       2:   2 4
       3:   3 5
       4:   4 6
       5:   5 7
       6:   6 6
       7:   7 5
       8:   8 4
       9:   9 3
      10:  10 2
      11:  11 1
      

      tidyverse 你可以适应以下内容:

      library(tidyverse)
      
      data.frame(date = seq(min(df$start_date), max(df$end_date), by = 1)) %>%
        rowwise() %>%
        mutate(count = sum(date >= df$start_date & date <= df$end_date))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 2015-08-06
        相关资源
        最近更新 更多