问题描述
如果其他列中有特定值,我正在使用的项目需要我按日期(每季度)计算频率。 数据如下所示:
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 在该季度未出现,则返回 0。 我愿意看到的输出是:
Date frequency
2016-Q2 2
2016-Q3 1
2016-Q4 0
2017-Q1 3
我知道代码部分 Result<-My_Data%>%group_by(Date)%>%summarise(frequency=n())
但我很难找到类似的东西,但对于选择值。
帮助将不胜感激。谢谢!
样本数据:
df <- tribble(
~Date,~Grade,"2016-Q2","A","2016-Q3","B","D","2016-Q4","2017-Q1","C"
)
解决方法
为什么不简单呢?
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
,
这对你有用吗?
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