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
相关产品推荐
相关产品推荐

