Я объединяю 2 временных ряда зоопарка с разной частотой.
Один с ежемесячными данными, а другой с квартальными данными.

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 теперь содержит

           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

Ищу способ задержать столбец gg на 1 месяц.
Итак, результат должен выглядеть так

           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

Значения gg_new сдвинуты на 1 месяц вверх.
Кто-нибудь знает, как это сделать?

2
Bjorn Mistiaen 3 Май 2016 в 19:36

2 ответа

Лучший ответ

Используйте lag и объедините его обратно с исходным, сохранив исходные месяцы, но не отставая ни одного месяца за пределами этого диапазона.

> 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

Для немного другого результата посмотрите на lag(mrg.tail, 0:1).

3
G. Grothendieck 3 Май 2016 в 16:54

Для этого можно использовать цикл for:

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
0
cgage1 3 Май 2016 в 16:53