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

如何用dplyr按item分组计算choice计数的累积求和?

解决dplyr分组计算choice计数累积求和的问题

你遇到的问题核心是分组层级不对,导致cumsum()没有在正确的范围内计算累积和。我们一步步来修正:

问题分析

你原来的代码:

dat %>% group_by(item, choice) %>% count() %>% mutate(n) %>% mutate(cum=cumsum(n))

这里group_by(item, choice)后,每个分组是item+choice的组合,每个分组只有1行数据,所以cumsum(n)只会返回当前行的n值,无法实现同一item下跨choice的累积求和。

修正方案

我们需要调整分组逻辑,确保累积求和是在同一item内,且按choice的顺序计算:

  1. 先统计每个item+choice的计数n;
  2. 切换分组为仅item,并按choice排序(保证累积顺序符合你的预期);
  3. 在item分组内计算n的累积和。

完整修正代码

set.seed(20) 
dat <- data.frame(item=c(rep("i1", 10), rep("i2", 10)), choice=c(sample(1:4, 20, replace = TRUE)))

library(dplyr)

dat %>%
  # 统计每个item+choice的数量,指定列名为n
  count(item, choice, name = "n") %>%
  # 按item分组,确保累积在同一item内进行
  group_by(item) %>%
  # 按choice排序,保证累积顺序是1→2→3→4
  arrange(choice) %>%
  # 计算同一item内的累积和
  mutate(cumsum = cumsum(n)) %>%
  # 取消分组(可选,方便查看结果)
  ungroup()

运行结果

执行后会得到你期望的输出:

# A tibble: 8 × 4
  item  choice     n cumsum
  <chr>  <int> <int>  <int>
1 i1         1     2      2
2 i1         2     3      5
3 i1         3     1      6
4 i1         4     4     10
5 i2         1     3      3
6 i2         2     3      6
7 i2         3     2      8
8 i2         4     2     10

关键说明

  • count(item, choice)等价于group_by(item, choice) %>% count(),写法更简洁;
  • arrange(choice)必须添加,否则cumsum的顺序可能混乱(比如choice可能按随机顺序排列);
  • 切换分组到item后,cumsum(n)才会在同一item下对所有choice的n进行累积计算。

内容的提问来源于stack exchange,提问作者ycc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:39