2017-09-21 10 views
0

私はpivottablerパッケージに問題がありました。あなたが手助けできるかどうか疑問に思っていました。pivottabler小さなNsと行の割合をカウントする(R)

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 & TrainCategoryによってTOCとの合計で、合計のために私のデータセットに列を追加しました。私はそれから計算された割合を取得しようとしましたが

#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

私はパッケージの著者です。

ピボットテーブルのボディの指定された%セルには、そのカテゴリの列数(Express/Ordinary)とすべてのカテゴリの数の両方が必要なため、行の割合はやや複雑です。バックログには、これを助けるいくつかの拡張機能があります。しかし、その間に、次のことが(コードの後の説明を)動作します:

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にカスタム計算機能に関する情報が少しあります。

関連する問題