Reputation: 6865
I'm merging 2 zoo time series, with different frequencies.
One with monthly data, and one with quarterly data.
library(Quandl)
myDataFormat <- "zoo"
pmi <- Quandl("FRED/NAPM", type = myDataFormat)
gdp <- Quandl("FRED/A191RO1Q156NBEA", type = myDataFormat)
pp <- aggregate(pmi, as.yearmon)
gg <- aggregate(gdp, as.yearmon)
mrg <- merge(pp,gg)
mrg.tail <- tail(mrg,20)
mrg.tail now contains
pp gg
sep 2014 55.8 NA
okt 2014 57.3 2.5
nov 2014 57.5 NA
dec 2014 54.9 NA
jan 2015 53.9 2.9
feb 2015 53.3 NA
mrt 2015 52.3 NA
apr 2015 51.6 2.7
mei 2015 53.1 NA
jun 2015 53.1 NA
jul 2015 51.9 2.1
aug 2015 51.0 NA
sep 2015 50.0 NA
okt 2015 49.4 2.0
nov 2015 48.4 NA
dec 2015 48.0 NA
jan 2016 48.2 2.0
feb 2016 49.5 NA
mrt 2016 51.8 NA
apr 2016 50.8 NA
I'm looking for a way to lag the gg column with 1 month.
So, the result should look like this
pp gg gg_new
sep 2014 55.8 NA 2.5
okt 2014 57.3 2.5 NA
nov 2014 57.5 NA NA
dec 2014 54.9 NA 2.9
jan 2015 53.9 2.9 NA
feb 2015 53.3 NA NA
mrt 2015 52.3 NA 2.7
apr 2015 51.6 2.7 NA
mei 2015 53.1 NA NA
jun 2015 53.1 NA 2.1
jul 2015 51.9 2.1 NA
aug 2015 51.0 NA NA
sep 2015 50.0 NA 2.0
okt 2015 49.4 2.0 NA
nov 2015 48.4 NA NA
dec 2015 48.0 NA 2.0
jan 2016 48.2 2.0 NA
feb 2016 49.5 NA NA
mrt 2016 51.8 NA NA
apr 2016 50.8 NA NA
The gg_new values are shifted up 1 month.
Does anybody know how to do this?
Upvotes: 2
Views: 92
Reputation: 269491
Use lag
and merge it back with the original keeping the original months but not any months lagged outside of that range.
> merge(mrg.tail, g1 = lag(mrg.tail$gg), all = c(TRUE, FALSE))
pp gg g1
Sep 2014 55.8 NA 2.5
Oct 2014 57.3 2.5 NA
Nov 2014 57.5 NA NA
Dec 2014 54.9 NA 2.9
Jan 2015 53.9 2.9 NA
Feb 2015 53.3 NA NA
Mar 2015 52.3 NA 2.7
Apr 2015 51.6 2.7 NA
May 2015 53.1 NA NA
Jun 2015 53.1 NA 2.1
Jul 2015 51.9 2.1 NA
Aug 2015 51.0 NA NA
Sep 2015 50.0 NA 2.0
Oct 2015 49.4 2.0 NA
Nov 2015 48.4 NA NA
Dec 2015 48.0 NA 2.0
Jan 2016 48.2 2.0 NA
Feb 2016 49.5 NA NA
Mar 2016 51.8 NA NA
Apr 2016 50.8 NA NA
For a slightly different result look at lag(mrg.tail, 0:1)
.
Upvotes: 3
Reputation: 577
You can use a for loop to do this:
for(i in 1:(nrow(mrg.tail)-1){ # Loop through all but last row
mrg.tail$gg_new[i] = mrg.tail$gg[i+1]
}
mrg.tail$gg_new[nrow(mrg.tail)] = NA # This is to take care of the last row
Upvotes: 0