【问题标题】:How could I count dates based on some condition?我如何根据某些条件计算日期?
【发布时间】:2025-12-28 05:10:06
【问题描述】:

我有两个日期变量,一个是问题开放日期,另一个是问题回答日期,如下所示:

   q_open     q_answer
2020-09-01   2020-09-02
2020-09-01   2020-09-09
2020-09-05      NA
2020-09-10   2020-09-17

我需要找出一周内未回答的问题的数量。一周从 min(q_open) 开始。所以第一周从 2020-09-01 开始,到 2020-09-07 结束。 所以想要的输出是:

Week   count_answered
 1         2           # considering NA also
 2         1

提前致谢。

【问题讨论】:

    标签: r date count lubridate


    【解决方案1】:

    这个怎么样:

    library(dplyr)
    library(lubridate)
    library(tibble)
    
    data <- tibble(
      q_open = as.Date(c("2020-09-01", "2020-09-01", "2020-09-05", "2020-09-10")),
      q_answer = as.Date(c("2020-09-02", "2020-09-09", NA, "2020-09-17"))
    )
    
    out <- data %>%
      mutate(wk_open = week(q_open),
             wk_answer = week(q_answer)) %>%
      mutate(on_time = ifelse(wk_answer >= wk_open + 1, TRUE, FALSE )) %>%
      group_by(wk_open) %>%
      summarise(count_answered = sum(on_time, na.rm = TRUE))
    

    与:

    > out
    # A tibble: 3 x 2
      wk_open count_answered
        <dbl>          <int>
    1      35              2
    2      36              0
    3      37              1
    

    【讨论】:

      【解决方案2】:

      我们可以计算出周数从最小值中减去q_open值,得到答案日期和q_open日期之间的周数之差,保留大于1周的行和count它们。

      library(dplyr)
      
      df %>%
        mutate(week_num = as.integer(ceiling(pmax(q_open - min(q_open), 1)/7))) %>%
        filter(difftime(q_answer, q_open,units = "weeks") >= 1 | is.na(q_answer)) %>%
        count(week_num)
      
      #  week_num n
      #1        1 2
      #2        2 1
      

      数据

      假设列属于日期类。如果他们没有先运行df[] &lt;- lapply(df, as.Date)

      df <- structure(list(q_open = structure(c(18506, 18506, 18510, 18515
      ), class = "Date"), q_answer = structure(c(18507, 18514, NA, 
      18522), class = "Date")), row.names = c(NA, -4L), class = "data.frame")
      

      【讨论】: