简体   繁体   中英

How to lag one column in a merged zoo object

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?

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) .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM