2015-02-10 9 views
5

Ho un problema che fare con le serie temporali a R.Qual è la funzione opposta al ritardo per un vettore R/dataframe?

#--------------read data 

wb = loadWorkbook("Countries_Europe_Prices.xlsx") 
df = readWorksheet(wb, sheet="Sheet2") 

x <- df$Year 
y <- df$Index1 

y <- lag(y, 1, na.pad = TRUE) 
cbind(x, y) 

Mi dà il seguente risultato:

 x  y 
[1,] 1974 NA 
[2,] 1975 50.8 
[3,] 1976 51.9 
[4,] 1977 54.8 
[5,] 1978 58.8 
[6,] 1979 64.0 
[7,] 1980 68.8 
[8,] 1981 73.6 
[9,] 1982 74.3 
[10,] 1983 74.5 
[11,] 1984 72.9 
[12,] 1985 72.1 
[13,] 1986 72.3 
[14,] 1987 71.7 
[15,] 1988 72.9 
[16,] 1989 75.3 
[17,] 1990 81.2 
[18,] 1991 84.3 
[19,] 1992 87.2 
[20,] 1993 90.1 

Ma voglio che il primo valore in Y da 50,8 e così via. In altre parole, voglio ottenere un ritardo negativo. Non capisco, come posso farlo?

Il mio problema è molto simile a questo problema, ma comunque non riesco a risolverlo. Credo che ancora non capisco la soluzione (s) ...

Basic lag in R vector/dataframe

+1

Puoi dput il tuo vettore y? –

+1

Un'altra opzione è ovviamente 'y <- c (y [-1], NA)'. – jbaums

+1

Che cos'è dput? @jbaums Wow, questa è davvero una soluzione facile al mio problema! Grazie mille! :) –

risposta

5

Cosa ne pensi della funzione "lead" integrata? (dal pacchetto dplyr) Non fa esattamente il lavoro della funzione di Ahmed?

cbind(x, lead(y, 1)) 

Se si vuole essere in grado di calcolare i ritardi positivi o negativi nella stessa funzione, vi suggerisco una versione 'corta' della sua funzione di 'shift':

shift = function(x, lag) { 
    require(dplyr) 
    switch(sign(lag)/2+1.5, lead(x, abs(lag)), lag(x, abs(lag))) 
} 

ciò che fa è creando 2 casi, uno con lag l'altro con lead, e sceglie un caso a seconda del segno del tuo lag (il +1.5 è qui per trasformare un {-1, +1} in un'alternativa {1, 2}).

+1

Proverò questa soluzione più avanti. Non ho pensato al pacchetto dplyr. Grazie! –

+1

Soluzione perfetta! Veramente! Molte grazie a tutti voi :) –

3

C'è un modo più semplice di fare questo che ho catturato appieno this link. Ciò che io voglio fare è spiegare che cosa si dovrebbe fare nei passaggi:

Innanzitutto creare la seguente funzione eseguendo il seguente codice:

shift<-function(x,shift_by){ 
    stopifnot(is.numeric(shift_by)) 
    stopifnot(is.numeric(x)) 

    if (length(shift_by)>1) 
     return(sapply(shift_by,shift, x=x)) 

    out<-NULL 
    abs_shift_by=abs(shift_by) 
    if (shift_by > 0) 
     out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by)) 
    else if (shift_by < 0) 
     out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by)) 
    else 
     out<-x 
    out 
} 

Questo creerà una funzione chiamata shift con due argomenti; uno è il vettore di cui hai bisogno per operare il suo lag/lead e l'altro è il numero di ritardi/lead di cui hai bisogno.

Esempio:

Si supponga di avere il seguente vettore:

x<-seq(1:10) 

x 
[1] 1 2 3 4 5 6 7 8 9 10 

se avete bisogno di x 's primo ritardo di ordine

shift(x,-1) 
[1] NA 1 2 3 4 5 6 7 8 9 

se avete bisogno di x' s primo vantaggio ordine (lag negativo)

shift(x,1) 
[1] 2 3 4 5 6 7 8 9 10 NA 
+1

Davvero bella funzione! Molte grazie! :) –

+1

conosci la funzione 'lead'? – agenis

+1

@agenis Ho appena controllato che. Ha fatto lo stesso come la funzione 'shift' sopra (solo per la parte positiva). La parte negativa dovrebbe essere eseguita con la normale funzione 'lag'. – athraa

Problemi correlati