Hello, I'm attempting to return the date (in form '%Y-%m-%d') of the Monday previous to the current date. For example: since it is 2011-09-02 today, I would expect 2011-08-29 to be the return value. I found the following in: http://www.mail-archive.com/r-help@r-project.org/msg144184.html Start quote from link: prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) For example,> prevmonday(Sys.Date())[1] "2011-08-15"> prevmonday(prevmonday(Sys.Date()))[1] "2011-08-15" End quote from link. But when I do it I get:> prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) > prevmonday(Sys.Date())Error in as.Date.numeric(1 - 4) : 'origin' must be supplied I've tried setting the 'origin' argument in as.Date() in different ways, but it returns inaccurate results. Thanks, Ben [[alternative HTML version deleted]]
On Sep 2, 2011, at 10:35 AM, Ben qant wrote:> Hello, > > I'm attempting to return the date (in form '%Y-%m-%d') of the Monday > previous to the current date. For example: since it is 2011-09-02 today, I > would expect 2011-08-29 to be the return value. > > I found the following in: > http://www.mail-archive.com/r-help at r-project.org/msg144184.html > > Start quote from link: > prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) > > For example, > >> prevmonday(Sys.Date()) > [1] "2011-08-15" >> prevmonday(prevmonday(Sys.Date())) > [1] "2011-08-15" > > End quote from link. > > But when I do it I get: >> prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) >> prevmonday(Sys.Date()) > Error in as.Date.numeric(1 - 4) : 'origin' must be supplied > > I've tried setting the 'origin' argument in as.Date() in different ways, but > it returns inaccurate results. > > Thanks, > > BenIf memory serves, this is because Gabor used the version of as.Date() from his 'zoo' package in that post, which does not require an origin to be specified, whereas the default as.Date() function in R's base package does: prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4)> prevmonday(Sys.Date())Error in as.Date.numeric(1 - 4) : 'origin' must be supplied> require(zoo)Loading required package: zoo Attaching package: 'zoo' The following object(s) are masked from 'package:base': as.Date> prevmonday(Sys.Date())[1] "2011-08-29" # Remove 'zoo' to use the base function detach(package:zoo)> prevmonday(Sys.Date())Error in as.Date.numeric(1 - 4) : 'origin' must be supplied # Fix the function to use base::as.Date() prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4, origin = "1970-01-01")> prevmonday(Sys.Date())[1] "2011-08-29" See ?as.Date HTH, Marc Schwartz
I didn't sort out the issue in my email below but here is a (not very R'ish) solution:> pm = function(x) {+ for(i in 1:7){ + if(format(as.Date(Sys.Date()-i),'%w') == 1){ + d = Sys.Date() - i; + } + } + d + }> pm(Sys.Date())[1] "2011-08-29" On Fri, Sep 2, 2011 at 9:35 AM, Ben qant <ccquant@gmail.com> wrote:> Hello, > > I'm attempting to return the date (in form '%Y-%m-%d') of the Monday > previous to the current date. For example: since it is 2011-09-02 today, I > would expect 2011-08-29 to be the return value. > > I found the following in: > http://www.mail-archive.com/r-help@r-project.org/msg144184.html > > Start quote from link: > prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) > > For example, > > > prevmonday(Sys.Date()) > [1] "2011-08-15" > > prevmonday(prevmonday(Sys.Date())) > [1] "2011-08-15" > > End quote from link. > > But when I do it I get: > > prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4) > > prevmonday(Sys.Date()) > Error in as.Date.numeric(1 - 4) : 'origin' must be supplied > > I've tried setting the 'origin' argument in as.Date() in different ways, > but it returns inaccurate results. > > Thanks, > > Ben >[[alternative HTML version deleted]]