R lubridate包wday函数按年份自定义week_start参数报错如何解决
问题原因
lubridate::wday()的week_start参数仅支持传入单个标量值,不支持向量化输入。你传入长度和数据集行数一致的years %% 7向量时,函数只会读取第一个值,其余值都会被忽略,因此触发你看到的警告。
解决方案
方案1:用dplyr::rowwise逐行运算(代码改动最小)
仅需要在原有代码基础上增加逐行分组的逻辑即可:
library(lubridate) library(dplyr) mydate2 <- mydate %>% mutate(Date = dmy(Date)) %>% # 直接用dmy解析「日/月/年」格式的字符串,无需冗余转换 rowwise() %>% # 开启逐行运算,保证每一行使用对应年份计算得到的week_start值 mutate( years = year(Date), days = wday(Date, label = TRUE, week_start = years %% 7) ) %>% ungroup() # 运算完成后取消行分组,避免影响后续数据操作
方案2:用purrr::map2配对传入参数
将日期和对应的week_start值一一配对传入wday即可:
library(lubridate) library(dplyr) library(purrr) mydate2 <- mydate %>% mutate( Date = dmy(Date), years = year(Date), week_start_val = years %% 7, days = map2(Date, week_start_val, ~wday(.x, label = TRUE, week_start = .y)) %>% unlist() # 将map返回的列表转为向量方便后续处理 )
补充说明
你原有代码里的日期解析逻辑存在冗余:as.Date(as.factor(Date), format = "%d/%m/%Y")已经得到了标准日期对象,不需要再套一层ymd()处理,直接用lubridate内置的dmy()函数解析对应格式的日期字符串更简洁,也不容易出错。
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

