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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:05:55