在R中的嵌套变量中具有行百分比的expss表

Posted

技术标签:

【中文标题】在R中的嵌套变量中具有行百分比的expss表【英文标题】:expss table with row percentage within nested variables in R 【发布时间】:2020-01-28 11:52:33 【问题描述】:

当使用 R 中的 expss 包创建表时,如何在嵌套变量中计算 row_percentages?在下面的示例中,我希望在每个时间段内计算行百分比。因此,我希望每个时间段(2015-2016 和 2017-2018)内的行百分比总和为 100%。但现在,百分比是在整行上计算的。

library(expss)

data(mtcars)

mtcars$period <- "2015-2016"
mtcars <- rbind(mtcars, mtcars)
mtcars$period[33:64] <- "2017-2018"

mtcars = apply_labels(mtcars,
                      cyl = "Number of cylinders",
                      am = "Transmission",
                      am = c("Automatic" = 0,
                             "Manual"=1),
                      period = "Measurement period"
)

mtcars %>% 
  tab_cells(cyl) %>% 
  tab_cols(period %nest% am) %>% 
  tab_stat_rpct(label = "row_perc") %>% 
  tab_pivot()

由reprex package (v0.3.0) 于 2019 年 9 月 28 日创建

 |                     |              |          | Measurement period |        |              |        |
 |                     |              |          |          2015-2016 |        |    2017-2018 |        |
 |                     |              |          |       Transmission |        | Transmission |        |
 |                     |              |          |          Automatic | Manual |    Automatic | Manual |
 | ------------------- | ------------ | -------- | ------------------ | ------ | ------------ | ------ |
 | Number of cylinders |            4 | row_perc |               13.6 |   36.4 |         13.6 |   36.4 |
 |                     |            6 | row_perc |               28.6 |   21.4 |         28.6 |   21.4 |
 |                     |            8 | row_perc |               42.9 |    7.1 |         42.9 |    7.1 |
 |                     | #Total cases | row_perc |               19.0 |   13.0 |         19.0 |   13.0 |

【问题讨论】:

【参考方案1】:

我相信这就是你所追求的:

library(expss)

data(mtcars)

mtcars$period <- "2015-2016"
mtcars <- rbind(mtcars, mtcars)
mtcars$period[33:64] <- "2017-2018"

mtcars = apply_labels(mtcars,
                      cyl = "Number of cylinders",
                      am = "Transmission",
                      am = c("Automatic" = 0,
                             "Manual"=1),
                      period = "Measurement period"
)

mtcars %>% 
  tab_cells(cyl) %>% 
  tab_cols(period %nest% am ) %>% 
  tab_subgroup(period =="2015-2016") %>%
  tab_stat_rpct(label = "row_perc") %>%
  tab_subgroup(period =="2017-2018") %>%
  tab_stat_rpct(label = "row_perc") %>%
  tab_pivot(stat_position = "inside_rows")

请注意tab_subgroup() 的使用,它决定了我们要计算百分比的年份,以及stat_position = "inside_rows",它决定了我们要将计算出的输出放在最终表格中的哪个位置。

输出:

 |                     |              |          | Measurement period |        |              |        |
 |                     |              |          |          2015-2016 |        |    2017-2018 |        |
 |                     |              |          |       Transmission |        | Transmission |        |
 |                     |              |          |          Automatic | Manual |    Automatic | Manual |
 | ------------------- | ------------ | -------- | ------------------ | ------ | ------------ | ------ |
 | Number of cylinders |            4 | row_perc |               27.3 |   72.7 |              |        |
 |                     |              |          |                    |        |         27.3 |   72.7 |
 |                     |            6 | row_perc |               57.1 |   42.9 |              |        |
 |                     |              |          |                    |        |         57.1 |   42.9 |
 |                     |            8 | row_perc |               85.7 |   14.3 |              |        |
 |                     |              |          |                    |        |         85.7 |   14.3 |
 |                     | #Total cases | row_perc |               19.0 |   13.0 |              |        |
 |                     |              |          |                    |        |         19.0 |   13.0 |

编辑:

如果我们不想要嵌套行(多行),我们不需要%nest%。在这种情况下,代码的最后部分应该修改如下:

mtcars %>% 
  tab_cells(cyl) %>% 
  tab_cols(period,am) %>% 
  tab_subgroup(period ==c("2015-2016")) %>%
  tab_stat_rpct(label = "row_perc") %>%
  tab_subgroup(period ==c("2017-2018")) %>%
  tab_stat_rpct(label = "row_perc") %>%
  tab_pivot(stat_position = "outside_columns")

输出:

 |                     |              | Measurement period | Transmission |          |           |
 |                     |              |          2015-2016 |    Automatic |   Manual | Automatic |
 |                     |              |           row_perc |     row_perc | row_perc |  row_perc |
 | ------------------- | ------------ | ------------------ | ------------ | -------- | --------- |
 | Number of cylinders |            4 |                100 |         27.3 |     72.7 |      27.3 |
 |                     |            6 |                100 |         57.1 |     42.9 |      57.1 |
 |                     |            8 |                100 |         85.7 |     14.3 |      85.7 |
 |                     | #Total cases |                 32 |         19.0 |     13.0 |      19.0 |

          | Measurement period |
   Manual |          2017-2018 |
 row_perc |           row_perc |
 -------- | ------------------ |
     72.7 |                100 |
     42.9 |                100 |
     14.3 |                100 |
     13.0 |                 32 |

【讨论】:

感谢维塔利!行百分比确实是根据需要计算的,但是作为副作用,表中的行数增加了一倍。 2017-2018 年的数据比 2015-2016 年的数据低一排。目前没什么大不了的,但是随着时间的推移,这可能会导致很多行和一个不太好看的表格。关于如何解决这个问题的任何想法? 我会调查的,@Steffen @Steffen 我进行了编辑。请让我知道您是否想要。

以上是关于在R中的嵌套变量中具有行百分比的expss表的主要内容,如果未能解决你的问题,请参考以下文章

带有计数和百分比的 expss mdset 表

R 具有两个因子变量的堆积百分比条形图 - 如何在图中标记百分比,而不计算 NA?

如何创建具有 1 个自变量和 3 个因变量的计数和百分比表和折线图

如何防止 R Expss 在输出数据框中将变量名称与行标签混合?

R Shiny ggplot 条形图和折线图,具有动态变量选择和 y 轴为百分比

R中的条件交叉表