Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在r中更改周的开始来计算周数_R_Data.table_Lubridate_Dayofweek_Week Number - Fatal编程技术网

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

通过在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

我试图通过将一周的开始时间从第7天(在lubridate中,默认的星期日=7)移到第5天(星期五)来计算周数。注意:如果您使用lubridate的
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”