通常情况下,任何一年的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
我在这里做错了什么?
答案 0 :(得分:2)
当您使用if
时,您正在使用ifelse
:
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))
}
答案 1 :(得分: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日的日期。
请注意,这和原始代码忽略了闰年。