在 r 中将计算行添加到数据透视表

adding Calculation row to PivotTable in r

这是我的数据

df=data.frame("indication"=c(1,1,0,0,1,0,1,1),"indication2"=c(1,0,1,0,1,0,0,1),"grade"=c(65,67,80,20,100,91,70,55),
       "group"=c("blue","red","green","blue","green","blue","red","green"))

  indication indication2 grade group
1          1           1    65  blue
2          1           0    67   red
3          0           1    80 green
4          0           0    20  blue
5          1           1   100 green
6          0           0    91  blue
7          1           0    70   red
8          1           1    55 green

我尝试对数据透视表执行的操作是添加第三行来计算 GRADE 列的平均值。

我的代码:

pt$addData(df)
pt$addColumnDataGroups("group")
pt$addRowGroup(variableName="indication", values="1",caption = "indication")
pt$addRowGroup(variableName="indication2", values="1",caption = "indication2")
pt$defineCalculation(calculationName="Total", summariseExpression="n()")
cg1 <- pt$addRowGroup()
pt$defineCalculation(calculationGroupName="mean_grade", calculationName="meanOfGRADE", 
                     summariseExpression="mean(grade, na.rm=TRUE)")
cg1$addCalculationGroups("meanOfGRADE")
pt$addRowCalculationGroups(atLevel = 1)
pt$renderPivot()

不幸的是:

理想的输出:(由 var "group" 计算的平均值)

你可以用 dplyr:

df <- data.frame("indication"=c(1,1,0,0,1,0,1,1),"indication2"=c(1,0,1,0,1,0,0,1),"grade"=c(65,67,80,20,100,91,70,55),
       "group"=c("blue","red","green","blue","green","blue","red","green"))

library(dplyr)

df %>%
  group_by(group) %>%
  summarise(across(starts_with("indic"), sum), 
            mean_grade = mean(grade)) %>%
  bind_rows(df %>% 
            summarise(group = "total", 
                      across(starts_with("indic"), sum), 
                      mean_grade = mean(grade))) 

returns

# A tibble: 4 x 4
  group indication indication2 mean_grade
  <chr>      <dbl>       <dbl>      <dbl>
1 blue           1           1       58.7
2 green          2           3       78.3
3 red            2           0       68.5
4 total          5           4       68.5

使用 pivottabler 您可以先将数据转换为长格式:

library(tidyr)

data <- df %>% 
  pivot_longer(-c(group, grade))

然后使用

library(pivottabler)

pt <- PivotTable$new()
pt$addData(data) 
pt$addRowDataGroups("group")
# pt$addColumnDataGroups("name")
pt$defineCalculation(calculationName = "Number of Indication 1", 
                     summariseExpression = "sum(value)",
                     filters = PivotFilters$new(pt, variableName="name", values="indication"))
pt$defineCalculation(calculationName = "Number of Indication 2", 
                     summariseExpression = "sum(value)",
                     filters = PivotFilters$new(pt, variableName="name", values="indication2"))
pt$defineCalculation(calculationName = "Mean Grade", summariseExpression = "mean(grade)")
pt$renderPivot()

创建(无法上传图像文件 atm):

#>          Number of Indication 1  Number of Indication 2  Mean Grade
#>  blue    1                       1                       58.6666666666667
#>  green   2                       3                       78.3333333333333
#>  red     2                       0                       68.5
#>  Total   5                       4                       68.5

我不知道如何转置这些数据。我第一次(很可能也是最后一次)使用 pivottablerpivottabler 小插图(尤其是第 03 章。计算:作为计算的一部分过滤数据”)是一个非常有用的资源。