【问题标题】:R number of rows in each day [duplicate]R每天的行数[重复]
【发布时间】:2020-08-18 20:37:52
【问题描述】:

我有一个数据框,每行都有时间窗口。时间窗口由每个 ID 的 start_date 和 end_date 标识。 对于每个日历日,我想知道 ID 的时间窗口如何跨越这一天。

示例数据

data <- data.frame(
id = c("A","B","C"), 
start_date = as.POSIXct(c("2020-01-01 01:00:00", "2020-01-02 01:00:00", "2020-01-03 01:00:00")),
end_date = as.POSIXct(c("2020-01-04 01:00:00", "2020-01-03 01:00:00", "2020-01-06 01:00:00")),
stringsAsFactors = FALSE
)

data

  id          start_date            end_date
1  A 2020-01-01 01:00:00 2020-01-04 01:00:00
2  B 2020-01-02 01:00:00 2020-01-03 01:00:00
3  C 2020-01-03 01:00:00 2020-01-06 01:00:00

我正在寻找的输出是将其聚合为每天存在的 ID 数量的天。

day         number_of_ids
2020-01-01  1
2020-01-02  2
2020-01-03  3
2020-01-04  2
2020-01-05  1
2020-01-06  1

非常感谢任何帮助。

【问题讨论】:

    标签: r date aggregate


    【解决方案1】:

    我们在list 列,unnest list 列中获取相应的'start_date','end_date' 之间的日期序列,然后按'day' 进行分组并获得不同'id 的数量' 与 n_distinctsummarise

    library(dplyr)
    library(purrr)
    library(tidyr)
    data %>%
        transmute(id, day = map2(as.Date(start_date), as.Date(end_date), 
              ~ seq(.x, .y, by = 'day'))) %>%
        unnest(c(day)) %>% 
        group_by(day) %>%
        summarise(number_of_ids = n_distinct(id))
    # A tibble: 6 x 2
    #  day        number_of_ids
    #  <date>             <int>
    #1 2020-01-01             1
    #2 2020-01-02             2
    #3 2020-01-03             3
    #4 2020-01-04             2
    #5 2020-01-05             1
    #6 2020-01-06             1
    

    【讨论】:

      【解决方案2】:

      在基础 R 中你可以这样做:

      a <- with(data, setNames(Map( function(x, y) format(seq(x,y,'1 day'), '%F'), start_date, end_date),id))
      aggregate(ind~values, stack(a), length)
            values ind
      1 2020-01-01   1
      2 2020-01-02   2
      3 2020-01-03   3
      4 2020-01-04   2
      5 2020-01-05   1
      6 2020-01-06   1
      

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多