You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:55:36