我如何根据某些条件计算日期?

How could I count dates based on some condition?

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

   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

提前致谢。

我们可以从最小值中减去 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

数据

假设列的日期为 class。如果他们不是运行df[] <- 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")

这个怎么样:

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