A.R - 8 months ago 33

R Question

I have some doubts about the leap years, how can I be sure that by using a formula like this

`add.years= function(x,y){`

if(!isTRUE(all.equal(y,round(y)))) stop("Argument \"y\" must be an integer.\n")

x <- as.POSIXlt(x)

x$year <- x$year+y

as.Date(x)

}

it will take into account leap years, when adding for example 100 years to my observation dataset? How can I control this?

I have a time series dataset with 50 years of observations:

`date obs`

1995-01-01 1.0

1995-01-02 2.0

1995-01-03 2.5

...

2045-12-30 0.2

2045-12-31 0.1

dataset+100 years

`date obs`

2095-01-01 1.0

2095-01-02 2.0

2095-01-03 2.5

...

2145-12-30 0.2

2145-12-31 0.1

After a basic check, I've noticed that the number of rows is the same for both original and 100 years after dataset. I am not sure if what was before the 29th Februray in a leap year will be now the obs value for the 1st of March in a non-leap year, etc.

I can check leap years using from the

Answer

You can check if a year is a leap year with `leap_year`

from `lubridate`

.

```
years <- 1895:2005
years[leap_year(years)]
```

This package will also handle not generating impossible 29ths of February.

```
ymd("2000-2-29") + years(1) # NA
ymd("2000-2-29") %m+% years(1) # "2001-02-28"
```

The `%m+%`

"add months" operator, as mentioned by @VitoshKa, rolls the date back to the end of the previous month if the actual day doesn't exist.