【问题标题】:Calculate percent change from a baseline year (t0) to a subsequent BUT LIMITED series of years (t1, ..., tk)计算从基准年 (t0) 到随后但有限的一系列年 (t1, ..., tk) 的百分比变化
【发布时间】:2012-11-10 12:19:36
【问题描述】:

假设您有某种费用的年度数据。您对第一个值 (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)的答案非常有帮助。再次感谢!

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

非常感谢任何想法!

非常感谢。

【问题讨论】:

    标签: r time plyr


    【解决方案1】:

    这个怎么样?

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

    【讨论】:

    • 漂亮!非常感谢。有时解决方案比您最初想象的要容易;-) 太好了。
    • 亲爱的 Jilber,我必须意识到我的问题比我发布的问题更难。我相应地编辑了这个问题,如果你能再看一眼,我将不胜感激。非常感谢!
    • @TiF,抱歉来晚了,你可以看到我的编辑,但我来晚了,你取消选中我的答案:(
    • 我非常抱歉,吉尔伯!您的回答仍然正确,这只是我编辑问题时的错。非常感谢您回答这个问题!
    【解决方案2】:

    要回答您的扩展问题,请使用 plyr 包中的 transformddply

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

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

    【讨论】:

    • 谢谢,保罗!非常感谢。
    【解决方案3】:

    如果您的数据框被称为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))
    

    【讨论】:

    • 谢谢肖恩。您的解决方案也非常有效。非常感谢!
    • 亲爱的 Sean,正如我也写信给 Jilber 一样,我计算百分比变化的问题实际上比最初发布的更复杂。你能再看看吗?那太棒了!非常感谢。
    • 只需将transform(或mutate)与ddply结合起来即可解决您更复杂的问题:ddply(df, .(case), transform, change = ((100 / value[1]) * value) - 100)
    • 我看到保罗已经把你整理出来了!
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多