R语言循环遍历DataFrame行生成新DataFrame的实现问题
问题需求
基于给定的Loans数据框,为每笔贷款的每个计息周期生成一行数据,每行包含对应贷款的ID和计息日期。用户编写的循环代码逻辑有误,但删除循环后可正常处理单条数据,需要修正代码实现批量处理。
原始Loans数据框
Loans <- data.frame( ID = c("215781","832567","721536"), From = c("01-01-2023","04-15-2022","09-23-2021"), End = c("05-02-2023","10-15-2023","12-23-2021"), Type = c("Monthly","Quarterly","Monthly"))
用户的错误代码
library(bizdays) Base <- data.frame("TM",today()) colnames(Base) <- c("TM","InterestDates") for (i in Loans[i,]){ df <- as.data.frame(seq.Date(Loans$From,Loans$Until,by="month")) colnames(df) <- "InterestDates" df$TM <- Loans$TM Base <- rbind(Base,df) }
预期输出示例
ID | InterestDates 250414 | 2022-05-16 250414 | 2022-06-16 250414 | 2022-07-18 250414 | 2022-08-16
修正后的解决方案
方法1:修正循环逻辑
用户代码的核心问题包括:循环遍历方式错误、日期列未转成Date类型、列名不匹配、初始数据框包含无效测试行。修正后的代码如下:
# 加载包 library(bizdays) # 将字符型日期转换为Date类型 Loans$From <- as.Date(Loans$From, format = "%m-%d-%Y") Loans$End <- as.Date(Loans$End, format = "%m-%d-%Y") # 初始化空的结果数据框 Base <- data.frame(ID = character(), InterestDates = Date(), stringsAsFactors = FALSE) # 循环处理每一行贷款数据 for (i in 1:nrow(Loans)) { # 获取当前行的参数 current_id <- Loans$ID[i] start_date <- Loans$From[i] end_date <- Loans$End[i] interval_type <- switch(Loans$Type[i], "Monthly" = "month", "Quarterly" = "3 months") # 生成计息日期序列(包含起始和结束日期) interest_dates <- seq.Date(start_date, end_date, by = interval_type) # 构建当前贷款的临时数据框 df <- data.frame( ID = current_id, InterestDates = interest_dates, stringsAsFactors = FALSE ) # 合并到结果数据框 Base <- rbind(Base, df) } # 查看结果 print(Base)
方法2:用tidyverse实现(更高效简洁)
如果习惯使用tidyverse工具链,可通过map_dfr批量处理,避免显式循环:
library(tidyverse) library(bizdays) # 转换日期类型+批量生成序列 Base <- Loans %>% mutate( From = as.Date(From, format = "%m-%d-%Y"), End = as.Date(End, format = "%m-%d-%Y"), # 根据Type生成对应的间隔参数 interval = case_when( Type == "Monthly" ~ "month", Type == "Quarterly" ~ "3 months" ) ) %>% # 按行生成日期序列并展开 rowwise() %>% mutate(InterestDates = list(seq.Date(From, End, by = interval))) %>% unnest(InterestDates) %>% # 保留需要的列 select(ID, InterestDates) # 查看结果 print(Base)
内容的提问来源于stack exchange,提问作者Matias Ochoa
相关产品推荐
相关产品推荐

