2

我想创建一个与rpivotTable包一起使用的计算字段,类似于在 excel 中看到的功能。

例如,考虑下表:

+--------------+--------+---------+-------------+-----------------+
| Manufacturer | Vendor | Shipper | Total Units | Defective Units |
+--------------+--------+---------+-------------+-----------------+
| A            | P      | X       |      173247 |           34649 |
| A            | P      | Y       |      451598 |          225799 |
| A            | P      | Z       |      759695 |          463414 |
| A            | Q      | X       |      358040 |          225565 |
| A            | Q      | Y       |      102068 |           36744 |
| A            | Q      | Z       |      994961 |          228841 |
| A            | R      | X       |      454672 |          231883 |
| A            | R      | Y       |      275994 |          124197 |
| A            | R      | Z       |      691100 |          165864 |
| B            | P      | X       |      755594 |          302238 |
| .            | .      | .       |           . |               . |
| .            | .      | .       |           . |               . |
+--------------+--------+---------+-------------+-----------------+

(我的实际表有更多列,维度和度量、时间等,我需要定义多个这样的“计算列”

如果我想计算缺陷率(应该是Defective Units/Total Units)并且我想按前三列中的任何一列进行汇总,我就做不到。

我尝试通过引用分配(:=),但这似乎仍然不起作用并总结了缺陷率(即,sum(Defective_Units/Total_Units)),而不是sum(Defective_Units)/sum(Total_Units)

myData[, Defect.Rate := Defective_Units / Total_Units]

这最终使我的缺陷率大于 1。我可以在任何地方声明一个计算字段,这只是一个评估后聚合的公式吗?

4

1 回答 1

2

你很幸运——pivottable.js 的创建者通过实现一个名为“Sum over Sum”的聚合器和更多类似的例子,预见到了像你(和我的,今天早些时候)这样的案例。https://github.com/nicolaskruchten/pivottable/blob/master/src/pivot.coffee#L111https://github.com/nicolaskruchten/pivottable/blob/master/src/pivot.coffee#L169

因此,我们将使用“Sum over Sum”作为参数“aggregatorName”,并在“vals”参数中使用我们想要的商的列。

以下是 mtcars 数据中用于可重复性的无意义使用示例:

require(rpivotTable)
data(mtcars)
rpivotTable(mtcars,rows="gear", cols=c("cyl","carb"),
            aggregatorName = "Sum over Sum",
            vals =c("mpg","disp"),
            width="100%", height="400px")
于 2017-11-27T18:34:24.577 回答