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