R Dplyr实操:按Loan Number分组后按不同条件返回每组对应行
现有代码问题说明
- 语法层面:基础
if()函数仅支持判断长度为1的逻辑值,你在分组后直接传入Principal_Remaining == 0返回的是该分组下所有行的布尔向量,会直接触发报错;同时代码存在括号不配对的语法错误。 - 逻辑层面:你没有先筛选出符合对应条件的行,直接调用
top_n取极值,无法匹配「首次满足某条件的行」的需求。 - 管道规则问题:dplyr管道中直接使用
if()无法自动识别分组上下文,需要搭配dplyr自带的分组处理函数使用。
解决方案
你可以搭配slice()和case_when()实现分组内按优先级取对应行的需求,代码如下:
library(dplyr) hope <- outcome %>% group_by(Loan_Number) %>% slice( case_when( # 优先级1:存在剩余本金为0的行,取该类行中Filter最小的行 any(Principal_Remaining == 0) ~ which.min(Filter[Principal_Remaining == 0]), # 优先级2:存在逾期本金大于0的行,取该类行中Filter最小的行 any(Principal_In_Arrears > 0) ~ which.min(Filter[Principal_In_Arrears > 0]), # 其余情况取分组内Filter最小的第一行 TRUE ~ which.min(Filter) ) ) %>% ungroup()
运行上述代码后得到的结果完全匹配你的需求:
- Loan_Number=100返回第1行
- Loan_Number=200返回Filter=7的第7行(首次剩余本金为0)
- Loan_Number=300返回Filter=10的第10行(首次出现逾期)
内容的提问来源于stack exchange,提问作者Matthew Oldham
相关产品推荐
相关产品推荐

