R语言计算每人各财季停留天数及mutate调用错误修复
报错原因
你编写的q1fun为单组起止日期设计,其中seq()函数要求输入的起止参数均为长度为1的单个值。而dplyr::mutate默认传入整列向量作为参数,不符合函数的输入要求,因此触发'from' must be of length 1报错。
修复方案
方案1:最小改动适配现有函数
使用rowwise()按行处理数据,每次仅传入单组起止日期调用函数:
library(dplyr) library(lubridate) df %>% rowwise() %>% mutate(q1_days = q1fun(start, end)) %>% ungroup() # 处理完成后取消行分组,避免影响后续运算
运行后第一行的q1_days结果为451,和你单独调用函数的结果一致,验证有效。
方案2:扩展为全季度通用计算
如果需要计算四个财季的停留天数,可以将函数改造为通用版本,避免重复编写4个季度函数:
# 通用季度天数计算函数,参数q为指定季度,取值1/2/3/4 calc_quarter_days <- function(start_date, end_date, q) { month_range <- switch(q, "1" = 1:3, "2" = 4:6, "3" = 7:9, "4" = 10:12) sum(month(seq(start_date, end_date, by = "days")) %in% month_range) } # 一次性计算所有季度的停留天数 df %>% rowwise() %>% mutate( q1_days = calc_quarter_days(start, end, 1), q2_days = calc_quarter_days(start, end, 2), q3_days = calc_quarter_days(start, end, 3), q4_days = calc_quarter_days(start, end, 4) ) %>% ungroup()
方案3:大数据量高性能方案
如果数据集规模较大,逐行生成日期序列的性能会较差,可以使用purrr::map2优化运算,或者通过直接计算日期与季度边界的交集天数累加,无需展开每日序列,性能提升更明显:
library(purrr) df %>% mutate(q1_days = map2_int(start, end, q1fun))
内容的提问来源于stack exchange,提问作者Michael Putman
相关产品推荐
相关产品推荐

