我正在做一个项目,并试图创建我们在任何给定日期的未结案例数量的图。数据表的示例如下。
case_files <- tibble(case_id = 1:10,
date_opened = c("2017-1-1",
"2017-1-1",
"2017-3-4",
"2017-4-4",
"2017-5-5",
"2017-5-6",
"2017-6-7",
"2017-6-6",
"2017-7-8",
"2017-7-8"),
date_closed = c("2017-4-1",
"2017-4-1",
"2017-5-4",
"2017-7-4",
"2017-7-5",
"2017-7-6",
"2017-8-7",
"2017-8-6",
"2017-9-8",
"2017-10-8"))
case_files$date_opened <- as.Date(case_files$date_opened)
case_files$date_closed <- as.Date(case_files$date_closed)
我正在尝试做的是创建另一个数据框,其中包含过去一年的日期以及每个日期被视为"未结"的案例数。然后,我将能够从此数据框进行绘图。
daily_open_cases <- tibble(n = 0:365,
date = today() - n,
qty_open = .....)
案件在date_opened
日或之后的日期和date_closed
或之前被视为未结
我考虑过做条件子集,然后使用nrow()
,但似乎无法让它工作。必须有一种更简单的方法可以做到这一点。我可以使用 COUNTIFS 函数在 Excel 中轻松完成此操作。
谢谢!
Excel 功能基本上是逻辑 1 和 0 的总和。在带有求和函数的 R 中很容易做到。我将构建一个包含所有日期的结构,然后遍历这些日期,在case_files
结构中的所有配对行中使用下面的两个不等式对逻辑向量进行汇总。R 中的&
函数是矢量化的:
daily_open_cases <- tibble(dt = as.Date("2017-01-01")+0:365,
qty_open = NA)
daily_open_cases$qty_open = sapply(daily_open_cases$dt,
function(d) sum(case_files$date_opened <= d & case_files$date_closed >=d) )
> head( daily_open_cases)
# A tibble: 6 x 2
dt qty_open
<date> <int>
1 2017-01-01 2
2 2017-01-02 2
3 2017-01-03 2
4 2017-01-04 2
5 2017-01-05 2
6 2017-01-06 2
>
这是一个"整洁"的解决方案,该方法与我刚刚dplyr
使用的 42 个group_by
和mutate
中的一种方法相同,而不是 base-rsapply
。
library(tidyverse)
library(magrittr)
days_files <- tibble(
date = as.Date("2017-01-01")+0:365,
no_open = NA_integer_
)
days_files %<>%
group_by(date) %>%
mutate(
no_open = sum(case_files$date_opened <= date & case_files$date_closed >= date)
)
# A tibble: 366 x 2
# Groups: date [366]
date no_open
<date> <int>
1 2017-01-01 2
2 2017-01-02 2
3 2017-01-03 2
4 2017-01-04 2
5 2017-01-05 2
6 2017-01-06 2
7 2017-01-07 2
8 2017-01-08 2
9 2017-01-09 2
10 2017-01-10 2
# ... with 356 more rows