想象一下,您有某些费用的年度数据。您感兴趣的是第一个值(t0)和每个后续值(t1,... - > tx)之间的百分比差异,但仅针对特定的观察组,即下一组,后续几年的新系列启动。
示例:
value <- c(10225,10287,10225,10087,10344,10387,10387,14567,13992,15432)
case <- c(A,A,A,B,B,B,B,B,C,C)
year value case change
1989 10225 A 0.00
1990 10287 A 0.61 # ((100/10225)*10287)-100
1991 10262 A 0.36
1995 10087 B 0.00
1996 10344 B 2.55 # ((100/10087)*10344)-100
1997 10387 B 2.97
1978 10387 B 2.97
1979 14567 B ...
1980 13992 C
1981 15432 C
如何计算R中的百分比变化?
我之前发布的帖子和类似帖子(例如this post on calculating relative difference)的答案非常有用。再次感谢!
然而,我必须意识到我的情况更复杂,并相应地编辑了我的问题。问题是我后来几年没有一系列,而是随后几年的有限系列数,每组一例。
非常感谢任何想法!
非常感谢。
答案 0 :(得分:4)
这个怎么样?
((value[-1]/value[1])-1)*100
[1] 0.6063570 0.0000000 -1.3496333 1.1638142 1.5843521 0.7334963
另一种选择
((value - value[1]) / value[1]) * 100
[1] 0.0000000 0.6063570 0.0000000 -1.3496333 1.1638142 1.5843521 0.7334963
对于您的更新问题,这里有两个R基础解决方案:
transform(df, Change = unlist(sapply(split(value, case), function(x) ((x - x[1]) / x[1]) * 100)))
value case Change
A1 10225 A 0.000000
A2 10287 A 0.606357
A3 10225 A 0.000000
B1 10087 B 0.000000
B2 10344 B 2.547834
B3 10387 B 2.974125
B4 10387 B 2.974125
B5 14567 B 44.413602
C1 13992 C 0.000000
C2 15432 C 10.291595
transform(df, Change = unlist(aggregate(value ~ case, function(x) ((x - x[1]) / x[1]) * 100, data=df)$value))
value case Change
01 10225 A 0.000000
02 10287 A 0.606357
03 10225 A 0.000000
11 10087 B 0.000000
12 10344 B 2.547834
13 10387 B 2.974125
14 10387 B 2.974125
15 14567 B 44.413602
21 13992 C 0.000000
22 15432 C 10.291595
答案 1 :(得分:3)
要回答您的扩展问题,请使用plyr包中的transform
和ddply
:
ddply(df, .(case), transform, change = ((100 / value[1]) * value) - 100)
关于你对NA和Inf值的评论,这是预期的行为,因为你除以零,使得变化毫无意义。您可以删除这些条目。
答案 2 :(得分:2)
如果您的数据框被调用,比如df
,请尝试以下操作:
transform(df, change = 100*(value/value[year==1989] - 1))
注意到这将给出1989年的0
而不是NA
的价值:
# year value change
# 1 1989 10225 0.0000000
# 2 1990 10287 0.6063570
# 3 1991 10225 0.0000000
# 4 1992 10087 -1.3496333
# 5 1993 10344 1.1638142
# 6 1994 10387 1.5843521
# 7 1995 10300 0.7334963
如果您知道您想要第一张唱片作为基础,您只需使用
即可transform(df, change = 100*(value/value[1] - 1))