2015-06-06 19 views
15

मैं अगले वर्ष के लिए तिमाही 1 की तुलना में तिमाही 1 की तुलना में विकास दर की गणना करने की कोशिश कर रहा हूं।
एक्सेल में सूत्र इस तरह दिखेगा ((बी 6-बी 2)/बी 2) * 100।तिमाही वर्ष से अधिक वर्ष की वृद्धि दर

आर में इसे पूरा करने का सबसे अच्छा तरीका क्या है? मुझे पता है कि अवधि से अवधि के अंतर कैसे प्राप्त करें, लेकिन इसे 4 समयावधि के अंतर के साथ पूरा नहीं कर सकते हैं।

date <- c("2000-01-01","2000-04-01", "2000-07-01", 
      "2000-10-01","2001-01-01","2001-04-01", 
      "2001-07-01","2001-10-01","2002-01-01", 
      "2002-04-01","2002-07-01","2002-10-01") 
value <- c(1592,1825,1769,1909,2022,2287,2169,2366,2001,2087,2099,2258) 
df <- data.frame(date,value) 

कौन इस डेटा फ्रेम का उत्पादन करेगा:

यहाँ कोड है

date  value 
1 2000-01-01 1592 
2 2000-04-01 1825 
3 2000-07-01 1769 
4 2000-10-01 1909 
5 2001-01-01 2022 
6 2001-04-01 2287 
7 2001-07-01 2169 
8 2001-10-01 2366 
9 2002-01-01 2001 
10 2002-04-01 2087 
11 2002-07-01 2099 
12 2002-10-01 2258 

उत्तर

7

का उपयोग कर

df = df %>% group_by(month=month(date)) %>% 
    arrange(date) %>% 
    mutate(yearOverYear=value/lag(value,1)) %>% 
    ungroup() %>% arrange(date) 

या यहाँ एक बहुत ही है सरल समाधान:

YearOverYear<-function (x,periodsPerYear){ 
    if(NROW(x)<=periodsPerYear){ 
     stop("too few rows") 
    } 
    else{ 
     indexes<-1:(NROW(x)-periodsPerYear) 
     return(c(rep(NA,periodsPerYear),(x[indexes+periodsPerYear]-x[indexes])/x[indexes])) 
    } 
} 


> cbind(df,YoY=YearOverYear(df$value,4)) 
     date value   YoY 
1 2000-01-01 1592   NA 
2 2000-04-01 1825   NA 
3 2000-07-01 1769   NA 
4 2000-10-01 1909   NA 
5 2001-01-01 2022 0.27010050 
6 2001-04-01 2287 0.25315068 
7 2001-07-01 2169 0.22611645 
8 2001-10-01 2366 0.23939235 
9 2002-01-01 2001 -0.01038576 
10 2002-04-01 2087 -0.08745081 
11 2002-07-01 2099 -0.03227294 
12 2002-10-01 2258 -0.04564666 
12

यहाँ dplyr पैकेज का उपयोग एक विकल्प है:

# Convert date column to date format 
df$date = as.POSIXct(df$date) 

library(dplyr) 
library(lubridate) 

नीचे कोड में, हम पहले महीने के आधार पर समूह करते हैं, जो हमें प्रत्येक तिमाही में अलग से काम करने की अनुमति देता है। arrange फ़ंक्शन बस यह सुनिश्चित करता है कि प्रत्येक तिमाही के भीतर डेटा तिथि के अनुसार आदेश दिया गया हो। फिर हम कॉलम को mutate का उपयोग करके जोड़ते हैं जो प्रत्येक वर्ष के लिए चालू वर्ष के अनुपात की तुलना पिछले वर्ष के लिए करता है।

df = df %>% group_by(month=month(date)) %>% 
    arrange(date) %>% 
    mutate(yearOverYear=value/lag(value,1)) 

     date value month yearOverYear 
1 2000-01-01 1592  1   NA 
2 2001-01-01 2022  1 1.2701005 
3 2002-01-01 2001  1 0.9896142 
4 2000-04-01 1825  4   NA 
5 2001-04-01 2287  4 1.2531507 
6 2002-04-01 2087  4 0.9125492 
7 2000-07-01 1769  7   NA 
8 2001-07-01 2169  7 1.2261164 
9 2002-07-01 2099  7 0.9677271 
10 2000-10-01 1909 10   NA 
11 2001-10-01 2366 10 1.2393924 
12 2002-10-01 2258 10 0.9543533 

आप समग्र तारीख क्रम में वापस साल-दर-साल मूल्यों को जोड़ने के बाद डेटा फ्रेम करने के लिए पसंद करते हैं: data.table

library(data.table) # v1.9.5+ 
setDT(df)[, .(date, yoy = (value-shift(value))/shift(value)*100), 
      by = month(date) 
     ][order(date)] 
+0

के लिए धन्यवाद आवश्यक है आपके का जवाब! बहुत सराहना की। – Wolf

5
df$yoy <- c(rep(NA,4),(df$value[5:nrow(df)]-df$value[1:(nrow(df)-4)])/df$value[1:(nrow(df)-4)]*100); 
df; 
##   date value  yoy 
## 1 2000-01-01 1592  NA 
## 2 2000-04-01 1825  NA 
## 3 2000-07-01 1769  NA 
## 4 2000-10-01 1909  NA 
## 5 2001-01-01 2022 27.010050 
## 6 2001-04-01 2287 25.315068 
## 7 2001-07-01 2169 22.611645 
## 8 2001-10-01 2366 23.939235 
## 9 2002-01-01 2001 -1.038576 
## 10 2002-04-01 2087 -8.745081 
## 11 2002-07-01 2099 -3.227294 
## 12 2002-10-01 2258 -4.564666 
+0

बहुत बहुत धन्यवाद। बहुत सरल रास्ता! – Wolf

2

एक और आधार आर समाधान। उस तारीख, तारीख प्रारूप में है ताकि आम महीने एक समूहीकरण चर के रूप में इस्तेमाल किया जा सकता है जो समारोह विकास दर की गणना करने के लिए

पारित किया जा सकता
# set date to a date objwct 
df$date <- as.Date(df$date) 

# order by date 
df <- df[order(df$date), ] 

# function to calculate differences 
f <- function(x) c(NA, 100*diff(x)/x[-length(x)]) 

df$yoy <- ave(df$value, format(df$date, "%m"), FUN=f) 
#   date value  yoy 
# 1 2000-01-01 1592  NA 
# 2 2000-04-01 1825  NA 
# 3 2000-07-01 1769  NA 
# 4 2000-10-01 1909  NA 
# 5 2001-01-01 2022 27.010050 
# 6 2001-04-01 2287 25.315068 
# 7 2001-07-01 2169 22.611645 
# 8 2001-10-01 2366 23.939235 
# 9 2002-01-01 2001 -1.038576 
# 10 2002-04-01 2087 -8.745081 
# 11 2002-07-01 2099 -3.227294 
# 12 2002-10-01 2258 -4.564666 

या

c(rep(NA, 4,), 100* diff(df$value, lag=4)/head(df$value, -4)) 
+1

आपके उत्तर के लिए धन्यवाद! – Wolf

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