2015-02-10 8 views
5

मैं आरआर वेक्टर/डेटाफ्रेम के लिए अंतराल के विपरीत विपरीत कार्य क्या है?

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

में समय श्रृंखला के साथ काम कर एक समस्या यह मुझे निम्न उत्पादन देता है:

 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 

लेकिन मैं y में पहला मान 50.8 और इसके आगे रहना चाहता हूँ। दूसरे शब्दों में, मैं एक नकारात्मक अंतराल प्राप्त करना चाहता हूँ। मुझे यह नहीं मिला, मैं यह कैसे कर सकता हूं?

मेरी समस्या इस समस्या के समान है, लेकिन हालांकि मैं इसे हल नहीं कर सकता। मुझे लगता है कि मैं अभी भी समाधान (रों) समझ में नहीं आता ...

Basic lag in R vector/dataframe

+1

क्या आप अपने वाई वेक्टर को डंप कर सकते हैं? –

+1

एक और विकल्प निश्चित रूप से 'y <- c (y [-1], NA)' है। – jbaums

+1

ड्यूटी क्या है? @jbaums वाह, यह वास्तव में मेरी समस्या का एक आसान समाधान है! आपको बहुत - बहुत धन्यवाद! :) –

उत्तर

5

बिल्ट-इन 'लीड' फ़ंक्शन के बारे में कैसे? (dplyr पैकेज से) क्या यह वास्तव में अहमद के कार्य का काम नहीं करता है?

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

क्या यह करता है:

cbind(x, lead(y, 1)) 

आप एक ही समारोह में तो सकारात्मक या नकारात्मक अंतराल गणना करने के लिए सक्षम होने के लिए चाहते हैं, तो मैं उसकी 'शिफ्ट' समारोह का एक 'छोटी' संस्करण का सुझाव 2 मामलों का निर्माण, एक दूसरे को लीड के साथ अंतराल के साथ, और अपने अंतराल के संकेत के आधार पर एक केस चुनता है (+1.5 एक {1, +1} को {1, 2} विकल्प में बदलने के लिए यहां है)।

+1

मैं बाद में इस समाधान की कोशिश करेंगे। Dplyr पैकेज के बारे में नहीं सोचा था। धन्यवाद! –

+1

बिल्कुल सही समाधान! वास्तव में! आप सभी को बहुत - बहुत धन्यवाद :) –

3

इस जो मैं this link से पूरी तरह से कब्जा कर लिया है करने का एक आसान तरीका है। क्या मैं यहाँ क्या करेंगे समझा है क्या आप चरणों में करना चाहिए:

पहले निम्न कोड चलाकर निम्नलिखित समारोह बनाने के लिए:

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 
} 

यह एक समारोह दो तर्क के साथ shift बुलाया पैदा करेगा; एक वह वेक्टर है जिसे आपको अपने अंतराल/लीड को संचालित करने की आवश्यकता होती है और दूसरा आपको आवश्यक लग्स/लीड्स की संख्या है।

उदाहरण:

मान लीजिए आप निम्नलिखित वेक्टर है:

x<-seq(1:10) 

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

अगर आप x जरूरत है (रों पहले के आदेश नेतृत्व के पहले के आदेश अंतराल

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

अगर आप x की जरूरत ' ऋणात्मक अंतराल)

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

वास्तव में अच्छा काम! आपका बहुत बहुत धन्यवाद! :) –

+1

'लीड' फ़ंक्शन के बारे में जानें? – agenis

+1

@agenis बस इसे चेक किया गया। यह उपरोक्त फ़ंक्शन 'शिफ्ट' जैसा ही था (केवल सकारात्मक भाग के लिए)। ऋणात्मक हिस्सा सामान्य 'अंतराल' समारोह द्वारा किया जाना चाहिए। – athraa

संबंधित मुद्दे