R语言:按组计算指定Item金额总和并生成分类列SUM
用dplyr实现分组计算与颜色赋值需求
可以通过分组计算目标项总和、判断组内是否包含目标项,再结合条件逻辑生成颜色列,具体实现如下:
1. 准备环境与示例数据
先确保安装并加载dplyr包:
# 若未安装dplyr,先执行安装 # install.packages("dplyr") library(dplyr) # 构造测试用数据框 df <- tibble( GROUP = c("G1", "G1", "G1", "G2", "G2", "G3", "G3", "G4"), ITEM = c("A", "B", "AT", "EP", "C", "D", "E", "AC"), AMOUNT = c(50, 20, 40, 15, 30, 10, 20, 85) )
2. 核心逻辑实现
通过分组计算+条件判断生成目标列:
result_df <- df %>% group_by(GROUP) %>% mutate( # 计算组内指定ITEM的AMOUNT总和 sum_target = sum(AMOUNT[ITEM %in% c("A", "AT", "EP", "AC")], na.rm = TRUE), # 判断组内是否存在指定ITEM has_target = any(ITEM %in% c("A", "AT", "EP", "AC")), # 按规则生成颜色值 COLOR = case_when( !has_target ~ "black", sum_target >= 80 ~ "red", sum_target <= 20 ~ "yellow", TRUE ~ "orange" ) ) %>% # 移除中间计算列(按需保留) select(-sum_target, -has_target) %>% ungroup() # 查看最终结果 print(result_df)
代码说明
group_by(GROUP):按GROUP分组,确保所有计算仅在组内生效sum_target:仅统计组内属于指定ITEM的AMOUNT总和,na.rm=TRUE避免空值干扰has_target:区分“组内无指定ITEM”和“有指定ITEM但总和为0”的场景case_when():按优先级匹配规则,先处理无目标项的情况,再依次匹配总和区间ungroup():取消分组,返回常规data.frame格式
示例输出
# A tibble: 8 × 4 GROUP ITEM AMOUNT COLOR <chr> <chr> <dbl> <chr> 1 G1 A 50 orange 2 G1 B 20 orange 3 G1 AT 40 orange 4 G2 EP 15 yellow 5 G2 C 30 yellow 6 G3 D 10 black 7 G3 E 20 black 8 G4 AC 85 red
内容的提问来源于stack exchange,提问作者Crippycajes
相关产品推荐
相关产品推荐

