2015-03-05 2 views
0

Установите семя и переменные. Пожалуйста, предположим, что все это раздел дан и неизменен.Создайте новый объект зоопарка на основе вектора имен переменных

library(zoo) 
set.seed(123) 
a <- zoo(rnorm(10), order.by = as.Date(50:60)) 
b <- zoo(rnorm(10), order.by = as.Date(50:60)) 
c <- zoo(rnorm(10), order.by = as.Date(50:60)) 
lags <- c(1,3,1) 
variables <- c("a","c","b") 

Я хочу, чтобы создать адекватный объект зоопарка, который выбирает переменные из списка «переменных» в указанном порядке, и применяется лаги от «лагов». Это мой желаемый результат (в том числе имен столбцов):

    a.l1  c.l3  b.l1 
20/02/1970   NA   NA   NA 
21/02/1970 -0.56047565   NA 1.2240818 
22/02/1970 -0.23017749   NA 0.3598138 
23/02/1970 1.55870831 -1.0678237 0.4007715 
24/02/1970 0.07050839 -0.2179749 0.1106827 
25/02/1970 0.12928774 -1.0260044 -0.5558411 
26/02/1970 1.71506499 -0.7288912 1.7869131 
27/02/1970 0.46091621 -0.6250393 0.4978505 
28/02/1970 -1.26506123 -1.6866933 -1.9666172 
01/03/1970 -0.68685285 0.837787 0.7013559 
02/03/1970 -0.44566197 0.1533731 -0.4727914 

Это один ближайший я мог бы получить, но он не работает. Проблема заключается в том, что я думаю о функции «get».

lag(as.zoo(mget(variables)),lags-1) 

Большое спасибо

ответ

0

mget(variables) фактически возвращает список с одним элементом в переменной variables, содержащая вектор значений в этой переменной.

Вы можете получить его в структуру, которую можно использовать с помощью lag(), привязывая элементы списка к столбцам с помощью do.call("cbind", mget(variables)). Насколько мне известно, на самом деле нет необходимости обертывать это в as.zoo().

Чтобы получить правильные запаздывания, вам нужно -lags, а не lags-1.

Сведя вместе, вы получите:

lagged <- lag(do.call("cbind", mget(variables)), -lags) 

, который содержит 1 и 3 лаги для каждой переменной, поэтому вам придется сделать немного постобработки, чтобы получить нужный формат. Далее следует сделать это:

lagged <- lagged[, c("a.lag-1", "c.lag-3", "b.lag-1")] 
colnames(lagged) <- c("a.l1", "c.l3", "b.l1") 

Примечание, однако, что поскольку в 1970-02-20 все лаги являются NA, эта строка исключается из вывода.

0

Я думаю, что это можно легко обработать, выполнив привязку данных зоопарка как data.frame, а затем применив mutate от dplyr, а затем сохраняя данные в виде зоопарка.

#cbind and apply mutate 
x1<-data.frame(cbind(a,b,c)) 
x1$Date<-row.names(x1) 
x2<-x1 %>% 
mutate(a=lag(a,1),b=lag(b,3),c=lag(c,1)) 
#convert back to zoo object 
x3<-zoo(x2,as.Date(x2$Date)) 
x3$Date<-NULL 

head(x3) 
      a   b   c   
1970-02-20 <NA>  <NA>  <NA>  
1970-02-21 -0.56047565 <NA>  -1.0678237 
1970-02-22 -0.23017749 <NA>  -0.2179749 
1970-02-23 1.55870831 1.2240818 -1.0260044 
1970-02-24 0.07050839 0.3598138 -0.7288912 
1970-02-25 0.12928774 0.4007715 -0.6250393 
Смежные вопросы