分组实例并根据条件为真的概率进行汇总

时间:2020-07-17 20:15:38

标签: r dplyr

我具有以下结构的数据,其中为每个响应者分配了一个状态可能为TRUE或FALSE的任务。

  month         Responder       Status  Department
  2020-02-01    A                 TRUE  1
  2020-02-01    B                FALSE  1
  2020-02-01    B                 TRUE  1
  2020-02-01    C                 TRUE  1
  2020-02-01    C                 TRUE  1
  2020-03-01    D                FALSE  2
  2020-03-01    E                FALSE  1
  2020-03-01    B                FALSE  1
  2020-03-01    F                FALSE  2
  2020-03-01    F                 TRUE  2
  2020-03-01    F                 TRUE  2

我想输出一个数据帧,以便给每个响应者一个Status = FALSE的概率。 我想按月和部门将这些结果分组如下:

  month         Responder    Prob_False    N    n
  2020-02-01    A            0             1    0
  2020-02-01    B            0.5           2    1  
  2020-02-01    C            0             2    0  
  2020-03-01    B            1             1    1
  2020-03-01    D            1             1    1
  2020-03-01    E            1             1    1
  2020-03-01    F            0.333         3    1
                  

其中N是当月分配给响应者的任务总数,n是具有FALSE状态的任务数,按月和响应者分组。

我正在尝试使用dplyr中的group_by并汇总函数,但我想我没有掌握针对此特定问题的正确应用。

1 个答案:

答案 0 :(得分:2)

我们可以对逻辑列的mean进行分组,并在获取n()的逻辑向量sum的同时,用FALSE来获得频率计数。当我们取反(!时,TRUE/FALSE变为FALSE/TRUE,并且TRUE / FALSE将存储为1/0,因此meansum起作用

library(dplyr)
df1 %>% 
    group_by(month, Responder) %>% 
    summarise(Prob_False = mean(!Status), N = n(), n = sum(!Status))
# A tibble: 7 x 5
# Groups:   month [2]
#  month      Responder Prob_False     N     n
#  <chr>      <chr>          <dbl> <int> <int>
#1 2020-02-01 A              0         1     0
#2 2020-02-01 B              0.5       2     1
#3 2020-02-01 C              0         2     0
#4 2020-03-01 B              1         1     1
#5 2020-03-01 D              1         1     1
#6 2020-03-01 E              1         1     1
#7 2020-03-01 F              0.333     3     1

mean(!Status)基本上是sum(Status == FALSE)/n()

数据

df1 <- structure(list(month = c("2020-02-01", "2020-02-01", "2020-02-01", 
"2020-02-01", "2020-02-01", "2020-03-01", "2020-03-01", "2020-03-01", 
"2020-03-01", "2020-03-01", "2020-03-01"), Responder = c("A", 
"B", "B", "C", "C", "D", "E", "B", "F", "F", "F"), Status = c(TRUE, 
FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE
), Department = c(1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L)),
class = "data.frame", row.names = c(NA, 
-11L))