2015-02-10 17 views
5

Bir sorun Bana şu çıktıyı verir R.Bir R vektörü/veri çerçevesi için gecikmenin tersi nedir?

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

zaman serileri ile ilgilenen vardır:

 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 

Ama y ilk değer 50,8 ve benzeri olmak istiyorum. Başka bir deyişle, olumsuz bir gecikme elde etmek istiyorum. Anlamadım, nasıl yapabilirim?

Sorunum bu soruna çok benzer, ancak yine de çözemiyorum. Ben

Basic lag in R vector/dataframe

+1

Y vektörünü kabul edebilir misiniz? –

+1

Başka bir seçenek de elbette ki <- c (y [-1], NA) 'dır. – jbaums

+1

Dput nedir? @jbaums Wow, bu gerçekten benim sorunum için kolay bir çözüm! Çok teşekkür ederim! :) –

cevap

5

Yerleşik 'lead' işlevine ne dersiniz? (dplyr paketinden) Tam olarak Ahmed'in işini yapmıyor mu?

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

Ne yapar: Aynı işlevi pozitif ya da negatif gecikme hesaplamak mümkün olmasını istiyorsanız

cbind(x, lead(y, 1)) 

, ben onun 'shift' fonksiyonunun bir 'kısa' versiyonunu önermek Biri diğeriyle ötelemeli olmak üzere 2 vaka yaratır ve gecikme işaretinize bağlı olarak bir vaka seçer (+1.5 bir {-1, +1} değerini {1, 2} alternatifine dönüştürmek için buradadır).

+1

Bu çözümü daha sonra deneyeceğim. Dplyr paketi hakkında düşünmedim. Teşekkürler! –

+1

Mükemmel çözüm! Gerçekten mi! Hepinize çok teşekkürler :) –

3

ben this link tamamen yakalanan hangi Bunu yapmanın daha kolay bir yolu yoktur ... Ben hala çözüm (ler) anlamıyorum sanırım.

İlk aşağıdaki kodu çalıştırarak aşağıdaki işlevi oluşturun:: Burada ne olacak adımlarda ne yapmalıyım açıklayan olan

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 
} 

Bu iki bağımsız değişkenlerle shift adlı bir işlev oluşturacaktır; Bunlardan biri gecikme/kurşunu çalıştırmak için ihtiyaç duyduğunuz vektördür ve diğeri ihtiyacınız olan gecikme/yol sayısıdır.

Örnek: (ler birinci dereceden kurşun 'sen x gerekirse ın birinci dereceden lag

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

' sen x gerekirse

x<-seq(1:10) 

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

:

aşağıdaki vektör olduğunu varsayalım negatif gecikme)

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

Gerçekten güzel bir işlev! Çok teşekkürler! :) –

+1

'lead' işlevi hakkında bilgi sahibi misiniz? – agenis

+1

@agenis Bunu kontrol ettim. Yukarıdaki "shift" işleviyle aynı şeyi yaptı (yalnızca pozitif kısım için). Olumsuz kısım normal "gecikme" fonksiyonu ile yapılmalıdır. – athraa