使用mutate()更新列时遇报错,需按OFFICIAL_NUMBER保留首值处理
R代码报错修复及需求实现
报错原因
在dplyr::mutate()中直接使用UPDATED_PENALTY$列名会调用整个数据框的列数据,而非当前分组内的对应行数据,导致长度不匹配(报错中分组内数据长度为12,但全局列长度为32217)。
修正代码
# 计算 HISTORIC_PENALTY(原逻辑保留) UPDATED_PENALTY$HISTORIC_PENALTY <- ave(UPDATED_PENALTY$PENALTY, UPDATED_PENALTY$OFFICIAL_NUMBER, FUN = cumsum) # 按 OFFICIAL_NUMBER 分组处理 cum_prodsum UPDATED_PENALTY <- UPDATED_PENALTY %>% group_by(OFFICIAL_NUMBER) %>% mutate( cum_prodsum = case_when( row_number() == 1 ~ HISTORIC_PENALTY, # 每组第一行保留原值 INSPECTION_CLEARED == TRUE ~ HISTORIC_PENALTY * 0.9, TRUE ~ HISTORIC_PENALTY * 0.9 + PENALTY ) ) %>% ungroup() # 可根据需求选择是否取消分组
关键说明
- 新增
group_by(OFFICIAL_NUMBER)明确分组,确保逻辑针对每个独立的编号组生效。 - 用
row_number() == 1识别每组第一行,直接保留HISTORIC_PENALTY原值。 - 替换
ifelse为case_when,多条件判断逻辑更清晰易读。 - 管道内直接使用列名(如
INSPECTION_CLEARED),避免全局数据引用导致的长度不匹配问题。
内容的提问来源于stack exchange,提问作者avxeesh
相关产品推荐
相关产品推荐

