R语言如何按id分组基于多条件创建数据框聚合新列
R语言按id分组聚合实现方案
字段计算规则说明
首先明确输出各列的统计逻辑,完全匹配预期输出结构:
month_begin:单id对应的总观测月份数,即分组后每组的记录总行数paid_off:单id下贷款结清(status = "C")的月份数num_of_pastdues:单id下所有逾期状态(status ∈ {"0","1","2","3","4","5"})的月份总数no_loan:单id下无贷款(status = "X")的月份数target:坏账标识,单id下只要存在逾期60天及以上的坏账状态(status ∈ {"2","3","4","5"})则赋值为1,否则赋值为0
实现代码(dplyr版本,推荐)
该版本代码可读性高,是R语言数据处理的主流实现方式:
# 加载依赖包,若未安装请先运行 install.packages("dplyr") library(dplyr) df1 <- df %>% group_by(id) %>% summarise( month_begin = n(), paid_off = sum(status == "C"), num_of_pastdues = sum(status %in% c("0","1","2","3","4","5")), no_loan = sum(status == "X"), target = as.integer(any(status %in% c("2","3","4","5"))) ) %>% # 转换非id列为字符型,完全匹配示例输出格式 mutate(across(-id, as.character)) %>% ungroup()
运行上述代码后得到的结果和给出的预期df1完全一致。
基础R实现(无第三方包依赖)
如果不想安装额外依赖包,可以使用基础R的分组计算逻辑实现:
# 按id切分数据后分组计算 agg_result <- lapply(split(df, df$id), function(sub_df){ data.frame( id = sub_df$id[1], month_begin = nrow(sub_df), paid_off = sum(sub_df$status == "C"), num_of_pastdues = sum(sub_df$status %in% c("0","1","2","3","4","5")), no_loan = sum(sub_df$status == "X"), target = as.integer(any(sub_df$status %in% c("2","3","4","5"))) ) }) df1 <- do.call(rbind, agg_result) # 转换非id列为字符型匹配示例格式 df1[,-1] <- lapply(df1[,-1], as.character) rownames(df1) <- NULL
说明:示例输入中两个id的
status最高仅为"1"(逾期30-59天),不存在60天以上的坏账记录,因此输出的target列均为0,和预期结果一致。如果后续数据中出现"2"/"3"/"4"/"5"类状态,target会自动标记为1。
内容的提问来源于stack exchange,提问作者tara
相关产品推荐
相关产品推荐

