我在使用pivottabler包时遇到了困难,想知道你是否可以提供帮助。
library(pivottabler)
# perform the aggregation in R code explicitly
trains <- bhmtrains %>%
group_by(TrainCategory, TOC) %>%
summarise(NumberOfTrains=n()) %>%
ungroup()
# display this pre-calculated data
pt <- PivotTable$new()
pt$addData(trains)
pt$addColumnDataGroups("TrainCategory")
pt$addRowDataGroups("TOC")
pt$defineCalculation(calculationName="TotalTrains", # << *** CODE CHANGE (AND BELOW) *** <<
type="value", valueName="NumberOfTrains",
summariseExpression="sum(NumberOfTrains)")
pt$renderPivot()
这会生成一个类似于此的
的类似枢轴的表有谁知道如何添加这样的行列的百分比?
我在我的数据集中添加了总计TOC和Total by TOC&amp; TrainCategory。我试图从中计算出百分比,但是
#total calculations
bhmtrains <- bhmtrains %>%
+ group_by(TOC) %>%
+ mutate(TOCCount = n())
bhmtrains <- bhmtrains %>%
+ group_by(TrainCategory) %>%
+ mutate(TrainCategoryCCount = n())
pt <- PivotTable$new()
pt$addData(trains)
pt$addColumnDataGroups("TrainCategory")
pt$addRowDataGroups("TOC")
pt$defineCalculation(calculationName="TotalTrains", # << *** CODE CHANGE (AND BELOW) *** <<
type="value", valueName="NumberOfTrains",
summariseExpression="sum(NumberOfTrains)")
##my attempt to calculate row percentage
pt$defineCalculation(calculationName="Percent", caption="%",
type="calculation", basedOn=c("TOCCount", "TrainCategoryCCount"),
format="%.1f %%",
calculationExpression="values$TOCCount/values$TrainCategoryCCount*100")
pt$renderPivot()
我收到了这个错误:
rror in if (calc$type == "value") { : argument is of length zero
有人可以帮忙吗?
答案 0 :(得分:1)
我是包裹作者。
行百分比稍微复杂一些,因为在数据透视表正文中的给定%单元格中,您需要该类别的列车数量(快速/普通)和所有类别的数量。积压中有一些增强功能可以帮助解决这个问题。但是,与此同时,以下内容将起作用(代码后面的解释):
getPercentageOfAllCategories <- function(pivotCalculator, netFilters, format, baseValues, cell) {
trains <- pivotCalculator$getDataFrame("bhmtrains")
netFilters$setFilterValues(variableName="TrainCategory", type="ALL", values=NULL, action="replace")
filteredTrains <- pivotCalculator$getFilteredDataFrame(trains, netFilters)
totalTrainsAllCategories <- nrow(filteredTrains)
percentageOfAllCategories <- baseValues$N / totalTrainsAllCategories * 100
value <- list()
value$rawValue <- percentageOfAllCategories
value$formattedValue <- pivotCalculator$formatValue(percentageOfAllCategories, format=format)
return(value)
}
library(pivottabler)
pt <- PivotTable$new()
pt$addData(bhmtrains)
pt$addColumnDataGroups("TrainCategory")
pt$addRowDataGroups("TOC")
pt$defineCalculation(calculationName="N", summariseExpression="n()")
pt$defineCalculation(calculationName="Percentage", caption="%", format="%.1f %%", basedOn="N",
type="function", calculationFunction=getPercentageOfAllCategories)
pt$renderPivot()
结果:
这可以通过定义一个自定义计算函数来实现,该函数在数据透视表中每%单元调用一次。自定义计算函数获取给定单元格的过滤器(即,哪个TOC和TrainCategory),然后覆盖类别过滤器以清除TrainCategory标准。然后将过滤器应用于数据框,计算得到的行数并计算百分比。 有关calculations vignette中自定义计算函数的更多信息。