如何用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的顺序计算:
- 先统计每个
item+choice的计数n; - 切换分组为仅
item,并按choice排序(保证累积顺序符合你的预期); - 在
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
相关产品推荐
相关产品推荐

