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の変化率を計算するにはどうすればよいですか?

私の以前の投稿と同様の投稿(たとえば、 相対差の計算に関するこの投稿)への回答は非常に役に立ちました。再度、感謝します!

しかし、私の場合はもっと複雑であることに気づき、それに応じて質問を編集しなければなりませんでした。問題は、私にはその後の年のシリーズが1つではなく、ケースのグループごとに1つ、後の年の限られたシリーズの数があることです。

どんなアイデアでも大歓迎です!

どうもありがとう。

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

更新された質問については、2つの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

拡張された質問に答えるには、plyr パッケージtransformと組み合わせて使用​​します。ddply

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))

0これは1989 年の値を与えることに注意してください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 に答える