按日期与名称统计A/B分类关联情况及B类总数的技术实现
统计关联A的B分类占比及相关指标的R实现
需求说明
需要完成以下统计任务:
- 统计同一日期、同一名称下同时存在A和B分类的记录数(即该名称当日既有A又有B的B条目数量)
- 统计每日的B分类总记录数
- 基于上述两个指标计算:
- 关联A的B分类占比 = 当日关联A的B记录数 / 当日B总记录数
- 未关联A的B分类占比 = 1 - 关联A的B分类占比
示例数据集
Date <- c("2022-01-01","2022-01-01","2022-01-01","2022-01-02","2022-01-02","2022-01-02", "2022-01-02") Name <- c("John Doe","John Doe","Peter Parker","Bruce Wayne","Bruce Wayne","Lebron James", "Jane Doe") Classification <- c("A","B","B", "B", "A", "B", "B") df <- data.frame(Date, Name, Classification) df
期望输出
(注:修正了原代码中变量名错误,将daily_total_output改为daily_total_b_output)
date_output <- c("2022-01-01", "2022-01-02") b_and_a_output <- c(1, 2) daily_total_b_output <- c(1, 3) desired_output <- data.frame(date_output, b_and_a_output, daily_total_b_output) desired_output
解决方案(使用dplyr)
library(dplyr) result <- df %>% # 按日期+名称分组,标记该组是否同时包含A和B分类 group_by(Date, Name) %>% mutate(has_both = all(c("A", "B") %in% Classification)) %>% ungroup() %>% # 按日期分组计算各项指标 group_by(Date) %>% summarise( b_and_a_output = sum(Classification == "B" & has_both), daily_total_b_output = sum(Classification == "B"), `关联A的B分类占比` = b_and_a_output / daily_total_b_output, `未关联A的B分类占比` = 1 - `关联A的B分类占比` ) %>% ungroup() print(result)
代码说明
- 分组标记:先通过
group_by(Date, Name)对每个用户的每日记录分组,用all(c("A", "B") %in% Classification)判断该分组是否同时存在A和B分类,生成has_both标记。 - 每日统计:再按日期分组,分别统计关联A的B记录数、当日B总记录数,最后直接计算两个占比指标。
内容的提问来源于stack exchange,提问作者Indescribled
相关产品推荐
相关产品推荐

