ANGELO.LINARDI at bancaditalia.it
2008-Sep-18 16:24 UTC
[R] Adding 1 month to a dataframe column
Dear R experts,
I have a problem in modifying one column of a dataframe with a datatime
format using a datetime operator.
Here is my dataframe A:
DATACONT PROVINCIA VALORE
1 2007-12-31 MI 1
2 2007-12-31 PV 2
3 2007-12-31 NA 3
4 2007-12-31 MI 4
5 2007-12-31 RM 5
6 2007-12-31 RM 6
7 2007-12-31 MI 7
8 2008-12-31 MI 11
9 2008-12-31 PV 12
10 2008-12-31 NA 13
11 2008-12-31 MI 14
12 2008-12-31 RM 15
13 2008-12-31 RM 16
14 2008-12-31 MI 17
15 2006-12-31 MI -9
16 2006-12-31 PV -8
17 2006-12-31 NA -7
18 2006-12-31 MI -6
19 2006-12-31 RM -5
20 2006-12-31 RM -4
21 2006-12-31 MI -3
Suppose I want to shift all dates by 1 year, obtaining the following
dataframe B:
DATACONT PROVINCIA VALORE
1 2008-12-31 MI 1
2 2008-12-31 PV 2
3 2008-12-31 NA 3
4 2008-12-31 MI 4
5 2008-12-31 RM 5
6 2008-12-31 RM 6
7 2008-12-31 MI 7
8 2009-12-31 MI 11
9 2009-12-31 PV 12
10 2009-12-31 NA 13
11 2009-12-31 MI 14
12 2009-12-31 RM 15
13 2009-12-31 RM 16
14 2009-12-31 MI 17
15 2007-12-31 MI -9
16 2007-12-31 PV -8
17 2007-12-31 NA -7
18 2007-12-31 MI -6
19 2007-12-31 RM -5
20 2007-12-31 RM -4
21 2007-12-31 MI -3
I tried with seq.Date:
seq.Date(a$"DATA",by="1 month",len=2)[2]
but it works only for single values (the "from" must have length=1).
Any hints ?
Thank you in advance
Angelo Linardi
** Le e-mail provenienti dalla Banca d'Italia sono trasmesse in buona fede e
non
comportano alcun vincolo ne' creano obblighi per la Banca stessa, salvo che
cio' non
sia espressamente previsto da un accordo scritto.
Questa e-mail e' confidenziale. Qualora l'avesse ricevuta per errore, La
preghiamo di
comunicarne via e-mail la ricezione al mittente e di distruggerne il contenuto.
La
informiamo inoltre che l'utilizzo non autorizzato del messaggio o dei suoi
allegati
potrebbe costituire reato. Grazie per la collaborazione.
-- E-mails from the Bank of Italy are sent in good faith but they are neither
binding on
the Bank nor to be understood as creating any obligation on its part except
where
provided for in a written agreement. This e-mail is confidential. If you have
received it
by mistake, please inform the sender by reply e-mail and delete it from your
system.
Please also note that the unauthorized disclosure or use of the message or any
attachments could be an offence. Thank you for your cooperation. **
Try this:
# example data - Jan 31/00, Feb 29/00, Mar 31/00, ..., Dec 31/00
d <- seq(as.Date("2000-02-01"), by = "month", length =
12) - 1
d
# find beginning of next month
nextmon <- function(d) as.Date(cut(as.Date(cut(d, "month")) +
32, "month"))
# add number of days from start of current month to next month
nextmon(d) + as.POSIXlt(d)$mday - 1
# If all your dates are at month end and you want the plus 1 month
# to be at month end too then replace last line with:
nextmon(nextmon(d)) - 1
The last one can be done even more easily with as.yearmon from zoo.
It converts the dates to a year plus 0 for jan, 1/12 for feb, etc. Also,
as.Date.yearmon(..., frac = 1) converts back from yearmon class to
Date class using end of month for the result so:
library(zoo)
as.Date(as.yearmon(d) + 1/12, frac = 1)
On Thu, Sep 18, 2008 at 12:24 PM, <ANGELO.LINARDI at bancaditalia.it>
wrote:> Dear R experts,
> I have a problem in modifying one column of a dataframe with a datatime
> format using a datetime operator.
> Here is my dataframe A:
>
> DATACONT PROVINCIA VALORE
> 1 2007-12-31 MI 1
> 2 2007-12-31 PV 2
> 3 2007-12-31 NA 3
> 4 2007-12-31 MI 4
> 5 2007-12-31 RM 5
> 6 2007-12-31 RM 6
> 7 2007-12-31 MI 7
> 8 2008-12-31 MI 11
> 9 2008-12-31 PV 12
> 10 2008-12-31 NA 13
> 11 2008-12-31 MI 14
> 12 2008-12-31 RM 15
> 13 2008-12-31 RM 16
> 14 2008-12-31 MI 17
> 15 2006-12-31 MI -9
> 16 2006-12-31 PV -8
> 17 2006-12-31 NA -7
> 18 2006-12-31 MI -6
> 19 2006-12-31 RM -5
> 20 2006-12-31 RM -4
> 21 2006-12-31 MI -3
>
> Suppose I want to shift all dates by 1 year, obtaining the following
> dataframe B:
>
> DATACONT PROVINCIA VALORE
> 1 2008-12-31 MI 1
> 2 2008-12-31 PV 2
> 3 2008-12-31 NA 3
> 4 2008-12-31 MI 4
> 5 2008-12-31 RM 5
> 6 2008-12-31 RM 6
> 7 2008-12-31 MI 7
> 8 2009-12-31 MI 11
> 9 2009-12-31 PV 12
> 10 2009-12-31 NA 13
> 11 2009-12-31 MI 14
> 12 2009-12-31 RM 15
> 13 2009-12-31 RM 16
> 14 2009-12-31 MI 17
> 15 2007-12-31 MI -9
> 16 2007-12-31 PV -8
> 17 2007-12-31 NA -7
> 18 2007-12-31 MI -6
> 19 2007-12-31 RM -5
> 20 2007-12-31 RM -4
> 21 2007-12-31 MI -3
>
> I tried with seq.Date:
> seq.Date(a$"DATA",by="1 month",len=2)[2]
>
> but it works only for single values (the "from" must have
length=1).
> Any hints ?
> Thank you in advance
>
> Angelo Linardi
>
> ** Le e-mail provenienti dalla Banca d'Italia sono trasmesse in buona
fede e non
> comportano alcun vincolo ne' creano obblighi per la Banca stessa, salvo
che cio' non
> sia espressamente previsto da un accordo scritto.
> Questa e-mail e' confidenziale. Qualora l'avesse ricevuta per
errore, La preghiamo di
> comunicarne via e-mail la ricezione al mittente e di distruggerne il
contenuto. La
> informiamo inoltre che l'utilizzo non autorizzato del messaggio o dei
suoi allegati
> potrebbe costituire reato. Grazie per la collaborazione.
> -- E-mails from the Bank of Italy are sent in good faith but they are
neither binding on
> the Bank nor to be understood as creating any obligation on its part except
where
> provided for in a written agreement. This e-mail is confidential. If you
have received it
> by mistake, please inform the sender by reply e-mail and delete it from
your system.
> Please also note that the unauthorized disclosure or use of the message or
any
> attachments could be an offence. Thank you for your cooperation. **
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>