如何对数据框中的多个变量执行 Excel 的 COUNTIFS 函数的 R 等效项

  • 本文关键字:COUNTIFS Excel 函数 执行 数据 变量 r
  • 更新时间 :
  • 英文 :


我正在做一个项目,并试图创建我们在任何给定日期的未结案例数量的图。数据表的示例如下。

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_bymutate中的一种方法相同,而不是 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

最新更新