如何创建一个函数和一个循环来计算R中数据框中变量的增长率

时间:2015-03-10 14:22:05

标签: r time-series

R和Stack Overflow的新手。假设我将以下宏观经济数据加载到R中名为testdata的数据框中。

> testdata
      date    gdp cpi_index rpi_index
21 2013 Q1 409985   125.067     247.4
22 2013 Q2 412620   125.971     249.7
23 2013 Q3 415577   126.352     250.9
24 2013 Q4 417265   127.123     252.5
25 2014 Q1 420091   127.241     253.9
26 2014 Q2 423249   128.139     256.0
27 2014 Q3 426022   128.191     256.9
28 2014 Q4 428347   128.312     257.4

我想生成一个名为testdata_growth的新数据,其中包含testdata中宏变量的q-o-q增长率。目前我的解决方法如下:

# Generating q-o-q growth rates
gdp_growth <- c(NA, diff(testdata$gdp)/ testdata$gdp[-1])
rpi_index_growth <- c(NA, diff(testdata$rpi_index)/ testdata$rpi_index[-1])
cpi_index_growth <- c(NA, diff(testdata$cpi_index)/ testdata$cpi_index[-1])

# Combining growth rates into a new data frame
testdata_growth <- data.frame(testdata$date, gdp_growth, rpi_index_growth, cpi_index_growth)

我的问题是如何将上述代码编写成循环,以便我可以更快地生成具有增长率的新数据框(因为我需要应用此增长率计算的几十个宏观经济变量)。 / p>

非常感谢任何协助。

谢谢!

(另外,如果您对如何改进我的问题有任何意见,我会在下次发布Stack Overflow时考虑这些 - 非常感谢!)

编辑:在

下添加了dput(testdata)
    > dput(testdata)
structure(list(date = structure(21:28, .Label = c("2008 Q1", 
"2008 Q2", "2008 Q3", "2008 Q4", "2009 Q1", "2009 Q2", "2009 Q3", 
"2009 Q4", "2010 Q1", "2010 Q2", "2010 Q3", "2010 Q4", "2011 Q1", 
"2011 Q2", "2011 Q3", "2011 Q4", "2012 Q1", "2012 Q2", "2012 Q3", 
"2012 Q4", "2013 Q1", "2013 Q2", "2013 Q3", "2013 Q4", "2014 Q1", 
"2014 Q2", "2014 Q3", "2014 Q4"), class = "factor"), gdp = c(409985L, 
412620L, 415577L, 417265L, 420091L, 423249L, 426022L, 428347L
), cpi_index = c(125.067, 125.971, 126.352, 127.123, 127.241, 
128.139, 128.191, 128.312), rpi_index = c(247.4, 249.7, 250.9, 
252.5, 253.9, 256, 256.9, 257.4)), .Names = c("date", "gdp", 
"cpi_index", "rpi_index"), row.names = 21:28, class = "data.frame")

3 个答案:

答案 0 :(得分:5)

library(dplyr)

testdata %>%
  select(-date) %>%
  mutate_each(funs(. / lag(.) - 1))

#           gdp    cpi_index   rpi_index
# 1          NA           NA          NA
# 2 0.006427064 0.0072281257 0.009296686
# 3 0.007166400 0.0030245056 0.004805767
# 4 0.004061822 0.0061020008 0.006377043
# 5 0.006772674 0.0009282349 0.005544554
# 6 0.007517419 0.0070574736 0.008270973
# 7 0.006551699 0.0004058093 0.003515625
# 8 0.005457465 0.0009439040 0.001946283

忍不住......

library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)

testdata %>%
  select(-date) %>%
  mutate_each(funs(. / lag(.) - 1)) %>%
  bind_cols(testdata[1], .) %>%
  gather(index, value, -date) %>% 
  ggplot(., aes(x = date, y = value, 
                color = factor(index), 
                group = factor(index))) + 
    geom_line() +
    scale_y_continuous(labels = percent)

Plot

答案 1 :(得分:5)

您也可以使用data.table。 data.table是一个非常强大的数据操作包。您可以开始使用here

library("data.table")
as.data.table(testdata)[, lapply(.SD, function(x)x/shift(x) - 1), .SDcols = 2:4]


           gdp    cpi_index   rpi_index
1:          NA           NA          NA
2: 0.006427064 0.0072281257 0.009296686
3: 0.007166400 0.0030245056 0.004805767
4: 0.004061822 0.0061020008 0.006377043
5: 0.006772674 0.0009282349 0.005544554
6: 0.007517419 0.0070574736 0.008270973
7: 0.006551699 0.0004058093 0.003515625
8: 0.005457465 0.0009439040 0.001946283

答案 2 :(得分:2)

您可以根据diff ged值的log来计算它。

cbind(testdata[1],sapply(testdata[-1], function(x) c(0,exp(diff(log(x)))-1)))
      date         gdp    cpi_index   rpi_index
21 2013 Q1 0.000000000 0.0000000000 0.000000000
22 2013 Q2 0.006427064 0.0072281257 0.009296686
23 2013 Q3 0.007166400 0.0030245056 0.004805767
24 2013 Q4 0.004061822 0.0061020008 0.006377043
25 2014 Q1 0.006772674 0.0009282349 0.005544554
26 2014 Q2 0.007517419 0.0070574736 0.008270973
27 2014 Q3 0.006551699 0.0004058093 0.003515625
28 2014 Q4 0.005457465 0.0009439040 0.001946283