如何用R脚本计算每日整洁数据中各分类的增减变化次数?
R实现分类数据跨时间区间的升降次数统计
企业每日记录category_1与category_2的数值,新企业可中途参与调研(如E企业于12月25日加入)。现有3天数据(12月24日、25日、26日),对应两个时间区间:12月24日-25日、12月25日-26日。需要统计每个分类在这3天内的上升、下降、无变化次数,手动统计结果为:
- cat1:上升2次、下降5次、无变化2次
- cat2:上升6次、下降2次、无变化1次
修正初始数据
原代码中date列的第三组数据重复了d2(12月25日),缺少d3(12月26日)的数据,先修正这个问题:
library("tidyverse") d1 <- as.Date("2022-12-24") d2 <- as.Date("2022-12-25") d3 <- as.Date("2022-12-26") df <- tibble( company = c(LETTERS[1:4], LETTERS[1:5], LETTERS[1:5]), cat1 = c(2, 3, 4, 5, 1, 4, 5, 3, 2, 1, 4, 4, 2, 1), cat2 = c(6, 7, 8, 9, 5, 5, 9, 10, 11, 6, 5, 10, 12, 13), date = c(rep(d1, 4), rep(d2, 5), rep(d3, 5)) # 修正此处,替换为d3 )
实现统计的完整脚本
使用tidyverse工具链完成统计,步骤清晰且高效:
df_stats <- df %>% # 转为长格式,统一处理两个分类 pivot_longer(cols = starts_with("cat"), names_to = "category", values_to = "value") %>% # 按企业、分类、日期排序,保证时间顺序正确 arrange(company, category, date) %>% # 计算当前值与前一天的差值,判断变化类型 group_by(company, category) %>% mutate( prev_value = lag(value), change_type = case_when( value > prev_value ~ "上升", value < prev_value ~ "下降", value == prev_value ~ "无变化", TRUE ~ NA_character_ # 无前置数据的首次记录标记为NA ) ) %>% ungroup() %>% # 过滤掉无前置数据的行(如新企业首次参与的记录) filter(!is.na(change_type)) %>% # 按分类和变化类型统计次数 count(category, change_type, name = "次数") %>% # 转为宽格式,方便查看结果 pivot_wider(names_from = change_type, values_from = 次数, values_fill = 0) print(df_stats)
输出结果
运行后得到与手动统计完全一致的结果:
# A tibble: 2 × 4 category 上升 下降 无变化 <chr> <int> <int> <int> 1 cat1 2 5 2 2 cat2 6 2 1
关键逻辑说明
pivot_longer:将cat1和cat2转为统一的category列,避免重复编写逻辑lag(value):获取同一企业、同一分类的前一日数值,用于对比变化case_when:根据数值差值判断变化类型,无前置数据的记录标记为NA后过滤count+pivot_wider:统计次数并整理为易读的宽格式
内容的提问来源于stack exchange,提问作者ixodid
相关产品推荐
相关产品推荐

