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

R语言dataframe按库存天数复制行并新增递增日期列实现问询

解决方案

基础R实现(无需额外安装包)

你可以直接在现有重复行的逻辑基础上,通过分组生成连续日期序列实现需求,完整代码如下:

# 你已完成的预处理步骤(假设end_date已提前定义)
df$`Dispose date`[is.na(df$`Dispose date`)] <- end_date
df$`Dispose time`[is.na(df$`Dispose time`)] <- 1700
df$`Days in Stock` = as.Date(df$`Dispose date`) - as.Date(df$`Creation date`) + 1

# 1. 按库存天数重复生成行
expanded_df <- df[rep(rownames(df), df$`Days in Stock`), ]

# 2. 分组生成连续日期列
expanded_df$Date <- ave(
  as.Date(expanded_df$`Creation date`),
  rownames(expanded_df), # 重复行的行名与原行一致,天然作为分组标识
  FUN = function(x) seq(from = x[1], length.out = length(x), by = "1 day")
)

# 3. 可选:将Date列调整到第一列,匹配你的示例输出结构
expanded_df <- expanded_df[, c("Date", setdiff(colnames(expanded_df), "Date"))]

tidyverse实现(逻辑更简洁)

如果可以使用tidyverse生态包,用列表列+展开的逻辑更易读,出错概率更低:

library(tidyverse)

# 预处理+展开一次性完成
result_df <- df %>%
  # 补全缺失值
  mutate(
    `Dispose date` = if_else(is.na(`Dispose date`), end_date, `Dispose date`),
    `Dispose time` = if_else(is.na(`Dispose time`), 1700, `Dispose time`),
    # 生成连续日期列表列
    Date = map2(as.Date(`Creation date`), as.Date(`Dispose date`), seq, by = "1 day")
  ) %>%
  unnest(Date) %>% # 展开列表列自动生成对应行数
  select(Date, everything()) # 调整Date到第一列

两种实现输出的结构完全符合你给出的示例要求。

内容的提问来源于stack exchange,提问作者moadeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:00