R按分组提取起始日期前5天及间隔日期补全数据报错求解
报错原因
你遇到的'from' must be of length 1报错,核心原因是seq()不属于dplyr的分组适配函数,你在管道中直接把整个分组后的数据框传给seq()作为第一个参数,函数无法按单个分组读取长度为1的起始日期值,无法正常生成序列。
正确实现方式
直接用tidyr::complete()做分组补全即可,不需要提前切片取最早日期,自动兼容任意数量的原始列,缺失值默认填充NA,完全匹配你的需求:
library(lubridate) library(dplyr) library(tidyr) data <- data.frame(date = c("2020-06-08", "2020-06-09", "2020-06-10", "2020-06-11", "2020-06-12", "2021-07-13", "2021-07-14", "2021-07-15", "2021-08-16", "2021-08-17", "2021-08-18", "2021-09-19", "2021-09-20"), value = c(2,1,7,1,0,1,2,3,4,7,6,5,10), category = c(1,1,1,1,1,2,2,2,3,3,3,4,4)) data$date <- as.Date(data$date) # 核心处理逻辑 result <- data %>% group_by(category) %>% complete( date = seq(min(date) - 5, min(date), by = "day") ) %>% ungroup()
逻辑说明
- 按
category字段分组后,complete()会为每个分组单独计算最早日期min(date),自动生成从最早日期往前5天到最早日期本身的连续6天日期 - 原始数据中存在的
category+date匹配记录,会自动保留所有原有列的取值;不存在的记录,除分组字段和日期字段外,其余所有列自动填充NA,无论原始数据有多少列都无需额外配置 - 以测试数据中category=1的分组为例,最终会生成2020-06-03至2020-06-08共6条记录,其中2020-06-03至2020-06-07的value字段为NA,2020-06-08的value为原始值2,符合预期。
如果你需要对特定列指定NA之外的填充值,可以在
complete()中加fill = list(列名1 = 填充值, 列名2 = 填充值)参数即可。
内容的提问来源于stack exchange,提问作者Karmic Dreamwork
相关产品推荐
相关产品推荐

