我已经看到了各种各样的帖子,详细介绍了如何执行类似的功能,但是我还没有找到一个可以将所有行除以参考行而又不包括参考行本身的帖子。
这是带有必需软件包的示例数据集:
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
感谢您的帮助!
答案 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)
)