在R数据框中计算百分比变化

31

我在R中有一个时间序列对象,其中包含多个向量。我想要计算每个向量在每个时间点的期间百分比变化(除了t = 1,显然为NA)。

> data <- ts(data.frame(x1=c(1:10), x2=c(11:20), x3=c(21:30)), start = c(2010,3), frequency = 4)
> data
        x1 x2 x3
2010 Q3  1 11 21
2010 Q4  2 12 22
2011 Q1  3 13 23
2011 Q2  4 14 24
2011 Q3  5 15 25
2011 Q4  6 16 26
2012 Q1  7 17 27
2012 Q2  8 18 28
2012 Q3  9 19 29
2012 Q4 10 20 30
2个回答

57

试一下这个:

R> data/stats::lag(data,-1) - 1
         data.x1   data.x2   data.x3
2010 Q4 1.000000 0.0909091 0.0476190
2011 Q1 0.500000 0.0833333 0.0454545
2011 Q2 0.333333 0.0769231 0.0434783
2011 Q3 0.250000 0.0714286 0.0416667
2011 Q4 0.200000 0.0666667 0.0400000
2012 Q1 0.166667 0.0625000 0.0384615
2012 Q2 0.142857 0.0588235 0.0370370
2012 Q3 0.125000 0.0555556 0.0357143
2012 Q4 0.111111 0.0526316 0.0344828
R> 

2
欢迎您。您现在可以“接受”(点击勾号)或“点赞”回答。您可以点赞多个,但只能接受一个。 - Dirk Eddelbuettel
2
我遇到了这个错误:Error in lag.default(data, -1) : n必须是一个正整数。 - Steve Rowe
这在dplyr的新版本中可能已经改变。在dplyr 0.4.3中,应该是lag(data, 1)。还有另一个名为lead的函数,用于比较未来值的偏移量。因此,n的负值没有任何意义。使用n的负值会导致错误。 - narendra-choudhary
3
请勿在此情境下使用dplyr。它会隐藏与其同名的基本R函数,这是非常不好的做法。 - Dirk Eddelbuettel
@DirkEddelbuettel 感谢您提供的信息。我想知道dplyr在0.5.0版本中是否仍然隐藏了基本的R函数。此外,在安装/加载dplyr之前可以正常工作的一个函数,在安装/加载dplyr之后出现了错误。 - Erdogan CEVHER
显示剩余2条评论

20

像这样的吗?

> diff(data)/data[-nrow(data),] * 100
               x1       x2       x3
2010 Q4 100.00000 9.090909 4.761905
2011 Q1  50.00000 8.333333 4.545455
2011 Q2  33.33333 7.692308 4.347826
2011 Q3  25.00000 7.142857 4.166667
2011 Q4  20.00000 6.666667 4.000000
2012 Q1  16.66667 6.250000 3.846154
2012 Q2  14.28571 5.882353 3.703704
2012 Q3  12.50000 5.555556 3.571429
2012 Q4  11.11111 5.263158 3.448276

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接