通过更改 r 中的周开始计算周数

calculate week number by changing the start of week in r

我试图通过将一周的开始从第 7 天(在 lubridate 中,默认星期日 = 7)移动到第 5 天(星期五)来计算周数注意:如果你得到来自 lubridate 的 wday 函数的星期几,它将 return 星期日为 1,星期五为 6,但为了让我的星期计数器开始星期五,它的日指数-1

也就是说,我编写了一个继续抛出错误的函数。

dates <- seq.Date(ymd(20150101), ymd(20171231), by = 1)

friday_week <- function(dates) {

  require(lubridate)
  require(data.table)
  require(dplyr)

dates = if(is.Date(dates) == F) {

 stop("this must be a date object")

}

date_yr = lubridate::year(dates)

wk_days = lubridate::wday(dates, week_start = 5)

date_df = data.frame(date_yr, wk_days) %>% data.table()

date_df[ , fri_wk := ifelse(cumsum(wk_days == 1) < 53, cumsum(wk_days == 1) 
+ 1, cumsum(wk_days == 1)), by = date_yr]

return(date_df$fri_wk)


}

运行 它带有日期,我收到此消息:

Error in as.POSIXlt.default(x, tz = tz(x)) : 
do not know how to convert 'x' to class “POSIXlt”

但是当我 运行 函数内的代码行在函数外逐行显示时,它产生的正是我想要的。

我迷路了。

你的错误应该在

dates = if(is.Date(dates) == F) {
stop("this must be a date object")
}

删除 dates = 部分。

变化:

dates = if(is.Date(dates) == F) {

    stop("this must be a date object")

  } 

至:

 if(is.Date(dates) == F) {

    stop("this must be a date object")

  }

在你调用lubridate::year(dates)的那一刻,datesNULL。在 lubridate::year() 函数中,它试图将 NULL 转换为 POSIX.lt

x <- NULL
as.POSIXlt(x)
# Error in as.POSIXlt.default(x) : 
#   do not know how to convert 'x' to class “POSIXlt”

了解如何使用 debug() 和浏览器。它将帮助您找到错误 :)