通过在r中更改周的开始来计算周数
我试图通过将一周的开始时间从第7天(在lubridate中,默认的星期日=7)移到第5天(星期五)来计算周数。注意:如果您使用lubridate的通过在r中更改周的开始来计算周数,r,data.table,lubridate,dayofweek,week-number,R,Data.table,Lubridate,Dayofweek,Week Number,我试图通过将一周的开始时间从第7天(在lubridate中,默认的星期日=7)移到第5天(星期五)来计算周数。注意:如果您使用lubridate的wday函数获取周数,它将在星期天返回1,在星期五返回6,但为了使我的周计数器在星期五开始,这是日指数-1 也就是说,我编写了一个函数,它会继续抛出错误 dates <- seq.Date(ymd(20150101), ymd(20171231), by = 1) friday_week <- function(dates) { r
wday
函数获取周数,它将在星期天返回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)
}
但是,当我在函数外部逐行运行函数内的代码行时,它会生成我想要的东西
我迷路了 您的错误应该在
dates = if(is.Date(dates) == F) {
stop("this must be a date object")
}
删除日期=部分。更改:
dates = if(is.Date(dates) == F) {
stop("this must be a date object")
}
致:
在调用lubridate::year(dates)
时,dates
为NULL
。在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”
x您尚未定义“移位”的方向。它应该基于年初一周中的天数配置,如果是这样的话,那么定义算法.lol,这是什么:date\u df=data.frame(date\u yr,wk\u days)%%>%data.table()
?对于接近投票人来说:这是一个很好的调试问题。它是完全可复制的,我们知道想要的行为。错误在于,if
语句的结果被分配给一个变量,该变量后来被用作参数。那不是打字错误,谢谢!我刚刚检查了调试工具…仍然没有,但我走上了正确的轨道。格雷西亚斯@ToddShannon掌握窍门需要一点时间,但一旦掌握了窍门,就会非常有帮助!我通常使用n
跳过函数调用,直到找到抛出错误的那一行,然后再次调用它,从n
切换到s
,如果我想进一步深入,就进入函数调用。请记住,您可以随时检查环境或任何变量的值。在RStudio中,环境窗口甚至会为您列出它。
if(is.Date(dates) == F) {
stop("this must be a date object")
}
x <- NULL
as.POSIXlt(x)
# Error in as.POSIXlt.default(x) :
# do not know how to convert 'x' to class “POSIXlt”