pivottabler计算小N和行百分比(R)

时间:2017-09-21 16:54:08

标签: r pivot-table

我在使用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()

这会生成一个类似于此的

的类似枢轴的表

enter image description here

有谁知道如何添加这样的行列的百分比?

enter image description here

我在我的数据集中添加了总计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

有人可以帮忙吗?

1 个答案:

答案 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()

结果:

results

这可以通过定义一个自定义计算函数来实现,该函数在数据透视表中每%单元调用一次。自定义计算函数获取给定单元格的过滤器(即,哪个TOC和TrainCategory),然后覆盖类别过滤器以清除TrainCategory标准。然后将过滤器应用于数据框,计算得到的行数并计算百分比。 有关calculations vignette中自定义计算函数的更多信息。