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
相关产品推荐
相关产品推荐

