如果其他列包含特定值,则日期的频率计数

frequency count of dates if other column contains specific values

如果其他列中有特定值,我正在处理的项目需要我按日期(每季度)计算频率。 数据如下所示:

ID  Date     Grade
1   2016-Q2  A
2   2016-Q2  A
3   2016-Q3  B
4   2016-Q3  D
5   2016-Q4  D
6   2017-Q1  B
7   2017-Q1  A
8   2017-Q1  B
9   2017-Q1  C

我正在尝试计算每个季度 A 和 B 出现的频率 。如果 A 或 B 在该季度未发生,则 returns 0。 我愿意看到的输出是:

Date     frequency
2016-Q2  2
2016-Q3  1
2016-Q4  0
2017-Q1  3

我知道代码部分Result<-My_Data%>%group_by(Date)%>%summarise(frequency=n()) 但我很难找到类似的东西,但 select 值。

非常感谢您的帮助。谢谢!

示例数据:

df <- tribble(
  ~Date,     ~Grade,
   "2016-Q2",  "A",
   "2016-Q2",  "A",
   "2016-Q3",  "B",
   "2016-Q3",  "D",
   "2016-Q4",  "D",
   "2017-Q1",  "B",
   "2017-Q1",  "A",
   "2017-Q1",  "B",
   "2017-Q1",  "C"
)

这对你有用吗?

Result<-My_Data%>%group_by(Grade, Date)%>%summarise(frequency=n())

我相信还有一种更简单的方法可以实现这一点。但是,这仍然有效:

library(dplyr)
library(purrr)

df %>%
  rowwise() %>%
  mutate(map_dfc(list(sum_A = "A", 
                      sum_B = "B"), ~ sum(cur_data() == .x))) %>%
  group_by(Date) %>%
  summarise(across(starts_with("sum"), sum), 
            count_A_B = sum(c_across(sum_A:sum_B))) %>%
  select(-c(sum_A, sum_B))

# A tibble: 4 x 2
  Date    count_A_B
  <chr>       <int>
1 2016-Q2         2
2 2016-Q3         1
3 2016-Q4         0
4 2017-Q1         3

为什么不简单呢?

library(dplyr)
df %>% group_by(Date) %>%
  summarise(freq = sum(Grade %in% c("A", "B")))

# A tibble: 4 x 2
  Date     freq
  <chr>   <int>
1 2016-Q2     2
2 2016-Q3     1
3 2016-Q4     0
4 2017-Q1     3

或在 BaseR 中

aggregate(Grade ~ Date, data = df,  FUN = function(x) sum(x %in% c("A", "B")))

     Date Grade
1 2016-Q2     2
2 2016-Q3     1
3 2016-Q4     0
4 2017-Q1     3