2

想象一下,您有某种费用的年度数据。您对第一个值 (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 的百分比变化?

我之前的帖子和类似帖子(例如, 这篇关于计算相对差异的帖子)的答案非常有帮助。再次感谢!

但是,我不得不意识到我的情况更复杂,并相应地编辑了我的问题。问题是我没有一个系列的后续年份,而是一系列有限的后续年份,每组案例一个。

任何想法都受到高度赞赏!

非常感谢。

4

3 回答 3

5

那这个呢?

((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
于 2012-11-10T12:23:09.737 回答
3

要回答您的扩展问题,请transform结合使用ddplyplyr 包中的 with:

ddply(df, .(case), transform, change = ((100 / value[1]) * value) - 100)

关于您对 NA 和 Inf 值的评论,这是预期的行为,因为您除以零,使更改毫无意义。您可以删除这些条目。

于 2012-11-13T15:58:34.077 回答
2

如果您的数据框被称为 ,请df尝试以下操作:

transform(df, change = 100*(value/value[year==1989] - 1))

请注意,这将给出01989 年的值,而不是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))
于 2012-11-10T12:30:13.660 回答