如何在R的data.frame中实现类似Excel MINIF的新变量生成逻辑
按贷款ID标记首次逾期行的R实现方案
需求说明:针对包含Portfolio.Date(观测日期)、Loan.Number(贷款ID)、Current.Delinquency.Code(逾期状态码)的数据框,生成Delinquent列——仅当某贷款ID首次出现状态码>3的行时标记为TRUE,其余行均为FALSE。
示例数据
首先构造示例数据(确保日期格式为Date类型):
df <- data.frame( Portfolio.Date = as.Date(c("2022/01/01", "2022/02/01", "2022/03/01", "2022/04/01", "2022/01/01", "2022/02/01", "2022/03/01", "2022/04/01", "2022/01/01", "2022/02/01", "2022/03/01", "2022/04/01")), Loan.Number = c(1,1,1,1,2,2,2,2,3,3,3,3), Current.Delinquency.Code = c(1,4,4,4,1,1,1,1,1,3,4,4) )
方法一:使用tidyverse(dplyr)
这是数据处理中常用的tidy风格方案,逻辑清晰易读:
library(dplyr) df <- df %>% group_by(Loan.Number) %>% mutate( # 判断当前贷款是否存在逾期记录 has_delinquent = any(Current.Delinquency.Code > 3), # 提取首次逾期日期,无逾期则设为NA first_delinquent_date = if(has_delinquent) min(Portfolio.Date[Current.Delinquency.Code > 3]) else NA, # 标记是否为首次逾期行,将NA转为FALSE Delinquent = replace_na(Portfolio.Date == first_delinquent_date, FALSE) ) %>% ungroup() %>% # 移除临时生成的辅助列 select(-has_delinquent, -first_delinquent_date)
方法二:使用Base R
无需额外安装包,适合依赖基础环境的场景:
# 按Loan.Number分组计算首次逾期日期 first_delinquent <- ave(df$Portfolio.Date, df$Loan.Number, FUN = function(x, code) { overdue_idx <- code > 3 if(any(overdue_idx)) min(x[overdue_idx]) else NA }, code = df$Current.Delinquency.Code) # 生成Delinquent列并处理NA值 df$Delinquent <- df$Portfolio.Date == first_delinquent df$Delinquent[is.na(df$Delinquent)] <- FALSE
最终结果
运行任意一种方法后,数据框会生成符合要求的Delinquent列,与示例预期一致:
Portfolio.Date Loan.Number Current.Delinquency.Code Delinquent 2022-01-01 1 1 FALSE 2022-02-01 1 4 TRUE 2022-03-01 1 4 FALSE 2022-04-01 1 4 FALSE 2022-01-01 2 1 FALSE 2022-02-01 2 1 FALSE 2022-03-01 2 1 FALSE 2022-04-01 2 1 FALSE 2022-01-01 3 1 FALSE 2022-02-01 3 3 FALSE 2022-03-01 3 4 TRUE 2022-04-01 3 4 FALSE
内容的提问来源于stack exchange,提问作者JotHa
相关产品推荐
相关产品推荐

