R:使用dplyr逐行总计

时间:2019-08-22 18:48:07

标签: r dplyr magrittr janitor

我已经看到了各种各样的帖子,详细介绍了如何执行类似的功能,但是我还没有找到一个可以将所有行除以参考行而又不包括参考行本身的帖子。

这是带有必需软件包的示例数据集:

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),
)

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

我们可以在此处使用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))))

答案 1 :(得分:2)

似乎adorn_percentages与自定义函数的作用相同。

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