【问题标题】:assign day numbers to dates [duplicate]将日期编号分配给日期[重复]
【发布时间】:2013-03-19 07:50:24
【问题描述】:

通常,任何一年的 1 月 1 日都分配给第 1 天。同样,任何一年的 2 月 1 日都是第 32 天。我想将任何一年的 10 月 1 日分配给第 1 天。我有一个执行此操作的函数:

    dayNumber <- function(date){
      library(lubridate)
      date <- as.Date(date)
      if(month(date)==10 | month(date)==11 | month(date)==12) 
      {x <- yday(date) - 273
      return(x)}
      if(month(date)==1 | month(date)==2 | month(date)==3) 
      {y <- yday(date) + 91
       return(y)}
    }

该功能似乎适用于单个日期:

dayNumber("2002-10-01")
[1] 1

dayNumber("2013-01-01")
[1] 92

但是,当应用于日期向量时,我会收到警告,并且日期编号未正确分配给所有日期:

myDates <- c("2003-11-16", "2007-11-01", "1992-10-11", "1993-11-14", "1995-11-12", 
             "2002-12-08", "2004-01-25", "2004-12-01", "2002-02-14", "2011-01-21")

dayNumber(myDates)
 [1]   47   32   12   45   43   69 -248   63 -228 -252
Warning message:
In if (month(date) == 10 | month(date) == 11 | month(date) == 12) { :
  the condition has length > 1 and only the first element will be used

我在这里做错了什么?

【问题讨论】:

  • if 只接受一个逻辑条件。 ifelse 是矢量化的。那么四月、五月、六月等呢?

标签: r date


【解决方案1】:

当你应该使用ifelse时,你正在使用if

dayNumber <- function(date){
  library(lubridate)
  date <- as.Date(date)
  ifelse(month(date)==10 | month(date)==11 | month(date)==12, yday(date) - 273,  
         ifelse(month(date)==1 | month(date)==2 | month(date)==3, yday(date) + 91, NA))
}

dayNumber(myDates)
 [1]  47  32  12  45  43  69 116  63 136 112

您可以使用%in% 进一步简化您的条件:

dayNumber <- function(date){
  library(lubridate)
  date <- as.Date(date)
  ifelse(month(date) %in% 10:12, yday(date) - 273,  
         ifelse(month(date) %in% 1:3, yday(date) + 91, NA))
}

【讨论】:

    【解决方案2】:

    这应该做同样的事情:

     date<-as.Date(date)
     (yday(date)) %% 274 + 1 + 90 * (yday(date) < 274)
     [1]  47  32  12  45  43  69 116  63 136 112
    

    这里的 274 是 10 月 1 日的天数。

    请注意,这和原始代码都忽略了闰年。

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多