R使用ceiling/floor date函数批量将多列月度数据转日度数据
R月度宽表批量扩展为日度数据方案
你需要批量处理所有ticker列时不需要手动指定列名,可通过dplyr的分组+批量列操作实现,逻辑是按原月度日期分组后生成当月日度序列,自动复用当月所有ticker的固定值,代码如下:
首先加载依赖包:
library(tidyverse) library(lubridate)
主流实现方案(适配dplyr 1.1.0及以上版本)
result <- mydata %>% # 统一日期格式 mutate(date = ymd(date)) %>% # 按原月度日期分组,每组对应单月的所有ticker取值 group_by(date) %>% reframe( # 生成当月所有日度日期 date = seq.Date( from = floor_date(date, unit = "month"), to = ceiling_date(date, unit = "month") - days(1), by = "day" ), # 批量处理所有非date列,自动复用当前分组的唯一月度值,适配任意数量ticker列 across(-date, first) ) %>% ungroup() %>% as.data.frame()
低版本dplyr兼容方案
如果你的dplyr版本较低没有reframe函数,可使用行处理+列表展开的方式实现,同样不需要手动指定ticker列:
result <- mydata %>% mutate(date = ymd(date)) %>% # 逐行处理单月数据 rowwise() %>% mutate( # 生成当月日度日期列表 date = list(seq.Date( from = floor_date(date, unit = "month"), to = ceiling_date(date, unit = "month") - days(1), by = "day" )) ) %>% # 展开日期列表,其他列自动跟随重复为当月固定值 unnest(date) %>% as.data.frame()
方案说明
两种方案都不需要手动指定任意ticker列名,会自动保留所有原始列的取值,最终输出结构为:每行对应单个自然日,所有ticker列取值为该行日期所属月度的原始月度值,符合需求。
内容的提问来源于stack exchange,提问作者Entrepreneur
相关产品推荐
相关产品推荐

