R语言:识别并汇总当月新增账户余额的技术问询
解决方法:提取每个账户首次出现的余额并按月份汇总
要实现“汇总每个月首次出现(新增)的账户余额”的需求,我们需要先定位每个账户第一次有非NA余额的记录,再按月份对这些新增账户的余额进行汇总。以下是两种常用的R语言实现方法:
第一步:修正并确认数据
首先先修正你提供的数据代码(去掉多余的...),确保数据框正确创建:
Accounts <- c('A','B','C','A','B','C','A','B','C') Dates <- as.Date(c('2016-01-31', '2016-01-31','2016-01-31','2016-02-28','2016-02-28','2016-02-28','2016-03-31','2016-03-31','2016-03-31')) Balances <- c(100,NA,NA,90,50,NA,80,40,120) Origination <- data.frame(Dates, Accounts, Balances)
方法一:使用tidyverse(dplyr)实现
这是最直观的方法,适合熟悉tidy语法的用户:
library(dplyr) # 1. 提取每个账户首次出现的非NA余额记录 first_valid_balances <- Origination %>% # 先过滤掉无余额(NA)的记录 filter(!is.na(Balances)) %>% # 按账户分组 group_by(Accounts) %>% # 保留每组的第一条记录(即首次有余额的记录) slice(1) %>% # 取消分组 ungroup() # 2. 按月份汇总新增账户的余额及账户列表 monthly_summary <- first_valid_balances %>% group_by(Dates) %>% summarize( total_new_balance = sum(Balances), # 当月新增账户余额总和 new_accounts = paste(Accounts, collapse = ", ") # 当月新增的账户列表 ) %>% ungroup() # 查看结果 print("每个账户首次余额记录:") print(first_valid_balances) print("\n每月新增账户余额汇总:") print(monthly_summary)
运行后会得到:
first_valid_balances:每个账户第一次有余额的详细记录monthly_summary:按月份统计的新增账户余额总和及对应的账户列表
方法二:使用Base R实现
如果你不想加载额外包,可以用Base R完成相同操作:
# 1. 过滤出有余额的记录 non_na_records <- Origination[!is.na(Origination$Balances), ] # 2. 找出每个账户首次出现的索引(去重,保留第一个) first_occurrence_indices <- !duplicated(non_na_records$Accounts) # 3. 提取首次余额记录 first_valid_balances_base <- non_na_records[first_occurrence_indices, ] # 4. 按月份汇总 monthly_summary_base <- aggregate( Balances ~ Dates, data = first_valid_balances_base, FUN = sum, na.rm = TRUE ) # 添加当月新增账户列表 monthly_summary_base$new_accounts <- aggregate( Accounts ~ Dates, data = first_valid_balances_base, FUN = function(x) paste(x, collapse = ", ") )$Accounts # 查看结果 print("每个账户首次余额记录(Base R):") print(first_valid_balances_base) print("\n每月新增账户余额汇总(Base R):") print(monthly_summary_base)
关键逻辑说明
- 我们先过滤掉
Balances为NA的记录,因为这些是没有有效余额的条目 - 对每个账户只保留第一条有效余额记录,这就是该账户首次出现的余额
- 最后按月份分组,即可得到每个月新增的账户及其余额汇总
内容的提问来源于stack exchange,提问作者Aksel Etingu
相关产品推荐
相关产品推荐

