You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:39:13