0

我正在使用 pivottabler R 包从需求和预测数据创建数据透视表。我有几种方法可以解决这个问题,但似乎都没有得到我想要的。我查看了很多文档,但没有一个是我想要实现的。

最简单的方法如下,但不幸的是,我无法找到一种方法来添加一个比较从 Current 到 Proposed 的更改的 Percent Change 列,因为它们没有明确定义为计算。

我无法共享我的基础数据,但它是长格式,带有 FORECAST_CREATION_ID 列,表示 PROPOSED、CURRENT、STAT_FORECAST、DEMAND 的值;时间数据(季度、年、月)和 DOSES 数据将用作数据透视表中的值。

pt <- PivotTable$new()
pt$addData(cte.pivot)
pt$addColumnDataGroups("YEAR", addTotal = FALSE)
pt$addColumnDataGroups("FORECAST_CREATION_ID", addTotal = FALSE, dataSortOrder = "custom",
                                               customSortOrder = c("DEMAND", "CURRENT", "PROPOSED", "STAT_FORECAST"))
pt$addRowDataGroups("QUARTER")
pt$addRowDataGroups("MONTH")
pt$defineCalculation(calculationName = "TotalDoses", summariseExpression = "sum(DOSES, na.rm = TRUE)", format = "%.0f")
pt$renderPivot()

在此处输入图像描述

按照下面的手动操作,我也取得了一些成功。我怀疑这不是最好的方法,我需要使用 pt$removeColumns() 手动删除空列,因为 pt$removeEmptyColumns() 不适合我。(基础数据在所有年份都没有需求、建议等,因此定义计算的空列。)我怀疑使用 addColumnGroup 和 addCalculationGroup 有更好的方法。

pt <- PivotTable$new()
pt$addData(cte.pivot)
pt$addColumnDataGroups("YEAR", addTotal = FALSE)
pt$addRowDataGroups("QUARTER")
pt$addRowDataGroups("MONTH")
pt$defineCalculation(calculationName = "demand", summariseExpression = "sum(DOSES)", filters = PivotFilters$new(pt, variableName = "FORECAST_CREATION_ID", values = "DEMAND"), visible = TRUE, format = "%.0f")
pt$defineCalculation(calculationName = "current", summariseExpression = "sum(DOSES)", filters = PivotFilters$new(pt, variableName = "FORECAST_CREATION_ID", values = "CURRENT"), visible = TRUE, format = "%.0f")
pt$defineCalculation(calculationName = "proposed", summariseExpression = "sum(DOSES)", filters = PivotFilters$new(pt, variableName = "FORECAST_CREATION_ID", values = "PROPOSED"), visible = TRUE, format = "%.0f")
pt$defineCalculation(calculationName = "PercentChange", type="calculation", basedOn = c("proposed", "current"), calculationExpression = "(values$proposed - values$current)/values$current", format = "%.1f %%")
pt$defineCalculation(calculationName = "stat_forecast", summariseExpression = "sum(DOSES)", filters = PivotFilters$new(pt, variableName = "FORECAST_CREATION_ID", values = "STAT_FORECAST"), visible = TRUE, format = "%.0f")
pt$evaluatePivot()
pt$removeEmptyColumns() # Error in if (isNULL == FALSE) { : missing value where TRUE/FALSE needed
pt$renderPivot()

在此处输入图像描述

4

0 回答 0