含公式与NA值的R语言case_when函数使用问题
问题与解决方案
问题背景
数据包含三列核心字段:
- EX1:支付金额
- EX2:周期类型(取值为
week或month) - EX3:支付周期数
存在数据质量问题:部分行的EX1、EX3为NA但EX2非NA,需先清理;同时要计算年度总支付额存入新列EX,并将EX2的NA值转为0用于后续计算。
原始数据示例:
EX1 EX2 EX3 20 week 1 100 week 2 400 month 5 100 month 1 NA NA NA NA NA NA 40 week 2
原始代码存在两处问题:计算月度年度支付额时误用了待创建的EX列;处理EX2 NA值的时机不合理。
修正后的代码
data %>% # 先将EX2的NA值转为"0" mutate(EX2 = if_else(is.na(EX2), "0", EX2)) %>% # 过滤掉EX1、EX3为NA的异常行 drop_na(EX1, EX3) %>% # 计算年度总支付额 mutate(EX = case_when( EX2 == "week" ~ (EX1 / EX3) * 52, EX2 == "month" ~ (EX1 / EX3) * 12, TRUE ~ 0 ))
关键说明
- NA值处理顺序:先把EX2的NA转为"0",再执行
drop_na过滤EX1/EX3的NA行,既保留了EX2有效但EX1/EX3异常的行过滤逻辑,又完成了EX2 NA转0的需求 - 月度计算逻辑修正:月度周期的年度支付额应为
(单周期金额) * 12,单周期金额是EX1/EX3,原始代码中的12/52是月度转周度的系数,不符合年度计算逻辑 - 默认值兜底:当EX2为"0"或其他异常值时,EX列赋值为0,满足后续计算需求
内容的提问来源于stack exchange,提问作者Pendragon
相关产品推荐
相关产品推荐

