R:使用 dplyr 按行总数划分行

R: Divide rows by row totals using dplyr

我看过很多详细介绍如何执行类似功能的帖子,但我还没有找到一个将所有行除以引用行同时排除引用行本身的帖子。

这是一组包含所需包的示例数据:

library(tidyverse)
library(janitor)

d <- tibble(
  level = as.factor(c(1:10)),
  var_1 = sample(c(1:20), 10),
  var_2 = sample(c(1:30), 10),
  var_3 = sample(c(1:40), 10),
  var_4 = sample(c(1:50), 10),
)

在下面的代码中,我将每一行除以 adorn_totals() 生成的 Total 行:

d %>%
  adorn_totals("row") %>%
  mutate_at(vars(-level), funs(round(./.[11]*100, 2)))

这是输出:

level  var_1  var_2 var_3  var_4
    1   3.66  13.89   6.0   6.50
    2  10.98  11.11   0.5   8.94
    3   4.88   7.64  14.0  15.45
    4   6.10  18.06  16.0   7.72
    5  18.29  13.19  10.0   9.35
    6  14.63  10.42  11.5   3.25
    7   2.44   6.25  12.5  19.51
    8   8.54  11.81  13.5   4.07
    9  23.17   3.47   1.0  20.33
   10   7.32   4.17  15.0   4.88
Total 100.00 100.00 100.0 100.00

但是,我想在不影响 Total 行本身的情况下 计算这些比例。下面我附上了所需的输出,其中的行总计未受影响,而其余行已根据我的函数进行了更改。

level  var_1  var_2 var_3  var_4
    1   3.66  13.89   6.0   6.50
    2  10.98  11.11   0.5   8.94
    3   4.88   7.64  14.0  15.45
    4   6.10  18.06  16.0   7.72
    5  18.29  13.19  10.0   9.35
    6  14.63  10.42  11.5   3.25
    7   2.44   6.25  12.5  19.51
    8   8.54  11.81  13.5   4.07
    9  23.17   3.47   1.0  20.33
   10   7.32   4.17  15.0   4.88
Total  82    144    200   246

感谢您的帮助!

我们可以在这里使用replace。这里,n() 给出最后一行的索引,-n() 从计算中删除最后一行。在 replace 中,索引向量参数 (list) 可以采用逻辑或数字索引

library(dplyr)
library(janitor)
d %>%
   adorn_totals("row") %>%
   mutate_at(vars(-level), list(~replace(., row_number() < n(),
                   round(.[-n()]/.[n()]*100, 2))))

似乎 adorn_percentages 与您的自定义函数执行相同的操作。

d %>% 
  adorn_percentages("col") %>% 
  mutate_at(vars(-level), ~round(.*100,2)) %>% 
  bind_rows(
    d %>% adorn_totals("row") %>% slice(11)
  )