R语言if_else函数在部分数据集失效的问题排查求助
R语言if_else函数在某数据集执行失败的排查与解决
我在R中使用if_else函数,基于4列数据生成新的结果向量,执行代码如下:
payment_amt <- if_else( interest_rate>0, (balance-(balance*amortisation_factor)/(1+(interest_rate/12))^tenor)*((interest_rate/12)/(1-((1+(interest_rate/12))^(-1*tenor)))), 0 )
这段代码在data_work数据集上运行正常,但在data_not_work数据集上无法执行。完整测试代码如下:
# Data Work _ test tenor = data_work[,"ECL_TENOR"] interest_rate = data_work[,"INTEREST_RATE"] amortisation_factor = data_work[,"AMORTISATION_FACTOR"] balance = data_work[,"ECL_BALANCE"] payment_amt <- if_else( interest_rate>0, (balance-(balance*amortisation_factor)/(1+(interest_rate/12))^tenor)*((interest_rate/12)/(1-((1+(interest_rate/12))^(-1*tenor)))), 0 ) payment_amt ##################################################### # Data Not work _ Test tenor = data_not_work[,"ECL_TENOR"] interest_rate = data_not_work[,"INTEREST_RATE"] amortisation_factor = data_not_work[,"AMORTISATION_FACTOR"] balance = data_not_work[,"ECL_BALANCE"] payment_amt <- if_else( interest_rate>0, (balance-(balance*amortisation_factor)/(1+(interest_rate/12))^tenor)*((interest_rate/12)/(1-((1+(interest_rate/12))^(-1*tenor)))), 0 )
同时提供了相关数据集的截图供参考。
排查与解决方向
1. 检查数据类型一致性
两个数据集的对应列可能存在类型差异(比如data_work是数值型,data_not_work是字符型),直接导致运算报错。执行以下代码对比类型:
# 查看data_work目标列类型 sapply(data_work[, c("ECL_TENOR", "INTEREST_RATE", "AMORTISATION_FACTOR", "ECL_BALANCE")], class) # 查看data_not_work目标列类型 sapply(data_not_work[, c("ECL_TENOR", "INTEREST_RATE", "AMORTISATION_FACTOR", "ECL_BALANCE")], class)
如果发现字符型列,用as.numeric()转换:
tenor <- as.numeric(data_not_work[,"ECL_TENOR"]) interest_rate <- as.numeric(data_not_work[,"INTEREST_RATE"]) amortisation_factor <- as.numeric(data_not_work[,"AMORTISATION_FACTOR"]) balance <- as.numeric(data_not_work[,"ECL_BALANCE"])
2. 排查缺失值与异常值
data_not_work中可能存在NA、Inf、NaN等异常值,中断运算。执行以下代码检查:
# 检查缺失值数量 colSums(is.na(data_not_work[, c("ECL_TENOR", "INTEREST_RATE", "AMORTISATION_FACTOR", "ECL_BALANCE")])) # 检查无限值数量 colSums(is.infinite(data_not_work[, c("ECL_TENOR", "INTEREST_RATE", "AMORTISATION_FACTOR", "ECL_BALANCE")]))
针对缺失值,可根据业务场景用na.omit()删除或tidyr::replace_na()填充。
3. 适配if_else的类型严格性
dplyr::if_else要求两个返回分支的类型完全一致,而基础R的ifelse会自动转换类型。如果计算结果是浮点型,而0是整数型,可能触发报错。可以:
- 替换为基础R的
ifelse测试:payment_amt <- ifelse( interest_rate>0, (balance-(balance*amortisation_factor)/(1+(interest_rate/12))^tenor)*((interest_rate/12)/(1-((1+(interest_rate/12))^(-1*tenor)))), 0.0 ) - 或者将
0改为浮点型0.0,保证和计算结果类型一致。
4. 避免数学运算错误
当tenor为0时,(1+(interest_rate/12))^(-1*tenor)会得到1^0=1,导致分母1-1=0,触发除以0的错误。检查data_not_work中是否存在tenor=0的情况:
sum(data_not_work[,"ECL_TENOR"] == 0, na.rm = TRUE)
如果存在,修改条件规避:
payment_amt <- if_else( interest_rate>0 & tenor != 0, (balance-(balance*amortisation_factor)/(1+(interest_rate/12))^tenor)*((interest_rate/12)/(1-((1+(interest_rate/12))^(-1*tenor)))), 0 )
内容的提问来源于stack exchange,提问作者pphong
相关产品推荐
相关产品推荐

