【问题标题】:Calculating percentage changes in data frame subsets using a base year使用基准年计算数据框子集的百分比变化
【发布时间】:2016-01-02 16:32:22
【问题描述】:

我有以下数据集,其中包含两家公司在五年内的销售数据信息。我想以第一年的数字为基准,计算每家公司随后每一年的销售额变化百分比。我使用以下内容:

transform(dataset, SalesD = unlist(aggregate(Sales ~ Company, function(x) ((x - x[1]) / x[1]) * 100, data=Dataset)$Sales))

但我没有得到第二家公司的正确值(我预计第 6 行的值为零,因为这是基准年)。结果如下:

+----+---------+------+--------+--------+
| ID | Company | Year | Sales  | SalesD |
+----+---------+------+--------+--------+
|  1 | LSL     | 2015 | 100000 |      0 |
|  2 | LSL     | 2016 | 120000 |     20 |
|  3 | LSL     | 2017 | 150000 |     50 |
|  4 | LSL     | 2018 | 100000 |      0 |
|  5 | LSL     | 2019 |  50000 |    -50 |
|  6 | IDA     | 2015 | 150000 |     50 |
|  7 | IDA     | 2016 | 180000 |     80 |
|  8 | IDA     | 2017 | 200000 |    100 |
|  9 | IDA     | 2018 | 180000 |     80 |
| 10 | IDA     | 2019 | 160000 |     60 | 
+----+---------+------+--------+--------+

你能帮我指出代码中有什么问题吗? 非常感谢!

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按“公司”分组,我们通过从对应于min 值的“销售额”值中减去“销售额”得到百分比变化“年份”,乘以 100,round 并分配 (:=) 以创建“SalesD”。

    library(data.table)
    setDT(df1)[, SalesD := round(100*(Sales- 
             Sales[which.min(Year)])/Sales[which.min(Year)]) , Company]
    df1
    #     ID Company Year  Sales SalesD
    # 1:  1     LSL 2015 100000      0
    # 2:  2     LSL 2016 120000     20
    # 3:  3     LSL 2017 150000     50
    # 4:  4     LSL 2018 100000      0
    # 5:  5     LSL 2019  50000    -50
    # 6:  6     IDA 2015 150000      0
    # 7:  7     IDA 2016 180000     20
    # 8:  8     IDA 2017 200000     33
    # 9:  9     IDA 2018 180000     20
    #10: 10     IDA 2019 160000      7
    

    【讨论】:

    • 谢谢你,它做到了! (虽然我需要读一点data.table库,但我不是很熟悉)
    • @orestisf 你可以查看vignettesFAQ
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2017-02-03
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多