Converting yearmon column to last date of the month in R

巧了我就是萌 提交于 2019-12-02 01:09:25

If the Date variable is an actual yearmon class vector, from the zoo package, the as.Date.yearmon method can do what you want via its argument frac.

Using your data, and assuming that the Date was originally a character vector

library("zoo")
df <- data.frame(Date = c("2014-07", "2014-08", "2014-09"),
                 Arrivals = c(100, 150, 200))

I convert this to a yearmon vector:

df <- transform(df, Date2 = as.yearmon(Date))

Assuming this is what you have, then you can achieve what you want using as.Date() with frac = 1:

df <- transform(df, Date3 = as.Date(Date2, frac = 1))

which gives:

> df
     Date Arrivals    Date2      Date3
1 2014-07      100 Jul 2014 2014-07-31
2 2014-08      150 Aug 2014 2014-08-31
3 2014-09      200 Sep 2014 2014-09-30

That shows the individual steps. If you only want the final Date this is a one-liner

## assuming `Date` is a `yearmon` object
df <- transform(df, Date = as.Date(Date, frac = 1))
## or if not a `yearmon`
df <- transform(df, Date = as.Date(as.yearmon(Date), frac = 1))

The argument frac in the fraction of the month to assign to the resulting dates when converting from yearmon objects to Date objects. Hence, to get the first day of the month, rather than convert to a character and paste on "-01" as your Question showed, it's better to coerce to a Date object with frac = 0.

If the Date in your df is not a yearmon class object, then you can solve your problem by converting it to one and then using the as.Date() method as described above.

Here is a way to do it using the zoo package.

R code:

library(zoo)
df
#      Date Arrivals
# 1 2014-07      100
# 2 2014-08      150
# 3 2014-09      200

df$Date <- as.Date(as.yearmon(df$Date), frac = 1)

# output
#         Date Arrivals
# 1 2014-07-31      100
# 2 2014-08-31      150
# 3 2014-09-30      200

Using lubridate, you can add a month and subtract a day to get the last day of the month:

library(lubridate)

ymd(paste0(df$Date, '-01')) + months(1) - days(1)
# [1] "2014-07-31" "2014-08-31" "2014-09-30"
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!