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

R语言按User分组后对Scores列实现横向累积乘法的方法

解决分组后横向累积乘法并转宽格式的问题

问题描述

给定如下R数据框:

df <- data.frame(User=c('User 1', 'User 1', 'User 1', 'User 2', 'User 2', 'User 2'), Scores=c(3, 9, 2, 7, 3, 4))

目标是按User分组后,对Scores列执行累积乘法,并将结果转换为横向的宽格式(每个用户一行,累积结果按顺序作为列)。

现有问题

使用group_by(User) %>% mutate(val=cumprod(Scores))只能得到长格式的累积结果,无法得到期望的宽格式输出。

解决方案

结合dplyr和tidyr包,先计算分组内的累积乘积并生成列名标识,再转换为宽格式:

library(dplyr)
library(tidyr)

# 处理数据
result <- df %>%
  group_by(User) %>%
  mutate(
    # 计算分组内的累积乘积
    cum_prod = cumprod(Scores),
    # 生成对应的列名(如Scores_1、Scores_2)
    col_name = paste0("Scores_", row_number())
  ) %>%
  # 转换为宽格式
  pivot_wider(
    names_from = col_name,
    values_from = cum_prod
  )

# 查看结果
print(result)

输出结果

# A tibble: 2 × 4
# Groups:   User [2]
  User   Scores_1 Scores_2 Scores_3
  <chr>     <dbl>    <dbl>    <dbl>
1 User 1        3       27       54
2 User 2        7       21       84

代码说明

  • group_by(User):按用户分组,确保累积计算仅在同一用户内部进行
  • mutate(cum_prod = cumprod(Scores)):计算分组内Scores的累积乘积
  • mutate(col_name = paste0("Scores_", row_number())):为每个累积结果生成唯一的列名,方便后续转宽格式
  • pivot_wider():将长格式数据转换为宽格式,把生成的列名作为新列,累积乘积作为对应列的值

内容的提问来源于stack exchange,提问作者U13-Forward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:20:39