将数据从累积的年度转换为每日

时间:2013-05-20 16:34:51

标签: r transformation

我正在尝试将显示销售额的数据转换为当年累计销售总额。我想显示白天出现的销售情况,而不是累计数字。

以下是数据示例:

Product, Geography, Date, SalesThisYear
Prod_1, Area_A, 20130501, 10
Prod_2, Area_B, 20130501, 5
Prod_1, Area_B, 20130501, 3
Prod_1, Area_a, 20130502, 12
Prod_2, Area_B, 20120502, 5
Prod_1, Area_B, 20130502, 4
...

所以转换的数据看起来像是:

Product, Geography, Date, SalesThisYear*, DailySales
Prod_1, Area_A, 20130501, 10, 10
Prod_2, Area_B, 20130501, 5, 5
Prod_1, Area_B, 20130501, 3, 3
Prod_1, Area_a, 20130502, 12, 2
Prod_2, Area_B, 20120502, 3, 0
Prod_1, Area_B, 20130502, 4, 1

然后可以在以后的分析中使用它。

  • 如果这对方法有任何影响,我每天都会收到一个新的数据文件,其中包含最新的销售信息。因此,我需要将新数据附加到现有数据,并计算出每日销售数据。这就是我在转换后的数据中保留SalesThisYear字段的原因,因此该字段可用于在下一个数据文件到达时计算新的DailySales数字。

我是 R 的新手,所以找出解决此问题的最佳方法。我知道我有两个分类字段,所以期待一种方法可以用来考虑这些领域。我的总体思路是使用一个函数,然后使用apply命令对整个数据集运行该函数。作为概述,我的想法是:

(首先将数据文件加载到 R 。使用rbind将第二个数据文件附加到 R 。)

创建一个执行以下操作的函数:

  1. 使用因子/类似物
  2. 识别产品和地理位置
  3. 确定最大日期和第二大日期
  4. 对于每个产品和地理位置组合,使用在步骤2中获得的日期值找到附加数据和原始数据的SalesThisYear值 - 我正在考虑使用此处的子集函数。减去这两个值:这就变成了 DailySales值。 (如果引入了新的地理位置或产品,则需要进行错误检查逻辑)
  5. 将新的DailySales值附加到结果中。
  6. 数据量大约是每天120k行,因此在步骤3中使用for循环的标准路径可能不可取。

    上述方法是否合适?或者我需要学习一个未知的未知数? :)

1 个答案:

答案 0 :(得分:1)

transform(d, 
    SalesThisDay = ave(SalesThisYear, Product, Geography, 
                       FUN=function(x) x - c(0, head(x, -1))))

#   Product Geography     Date SalesThisYear SalesThisDay
# 1  prod_1    area_a 20130501            10           10
# 2  prod_2    area_b 20130501             5            5
# 3  prod_1    area_b 20130501             3            3
# 4  prod_1    area_a 20130502            12            2
# 5  prod_2    area_b 20120502             5            0
# 6  prod_1    area_b 20130502             4            1