如何在不传递前置参数的情况下为adorn_totals指定求和列?
如何简洁使用janitor::adorn_totals仅对指定列计算总计?
我在使用dplyr和janitor处理mtcars数据时,执行以下代码:
library(dplyr) library(janitor) mtcars %>% count(vs, am) %>% adorn_totals()
得到的输出是:
vs am n 0 0 12 0 1 6 1 0 7 1 1 7 Total 2 32
我只希望对n列计算总计,不希望计算am列的总计。我知道可以通过adorn_totals(,,,, n)实现,但这种需要写多个前置空参数的写法不够简洁。尝试使用adorn_totals(... = n)时出现报错:
mtcars %>% count(vs, am) %>% adorn_totals(... = n)
报错信息:
Error in `adorn_totals()`: ! Names can't be of the form `...` or `..j`. ✖ These names are invalid: * "..." at location 1. Backtrace: ▆ 1. ├─mtcars %>% count(vs, am) %>% adorn_totals(... = n) 2. └─janitor::adorn_totals(., ... = n) 3. └─tidyselect::eval_select(expr, data = dat) 4. └─tidyselect:::eval_select_impl(...) 5. ├─tidyselect:::with_subscript_errors(...) 6. │ └─rlang::try_fetch(...) 7. │ └─base::withCallingHandlers(...) 8. └─tidyselect:::vars_select_eval(...) 9. └─tidyselect:::ensure_named(...) 10. └─vctrs::vec_as_names(names(pos), repair = "check_unique", call = call) 11. └─vctrs (local) `<fn>`() 12. └─vctrs:::validate_unique(names = names, arg = arg, call = call) 13. └─vctrs:::stop_names_cannot_be_dot_dot(names, call = call) 14. └─vctrs:::stop_names(...) 15. └─vctrs:::stop_vctrs(...) 16. └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))
请问有没有更直接的方法实现仅指定n列计算总计,无需传递前置空参数?
解决方案
可以通过明确指定前置参数的名称来避免写多个占位逗号,比如指定name参数(保持默认值"Total"),然后直接传入目标列名n,这样就无需用逗号跳过前面的参数:
library(dplyr) library(janitor) mtcars %>% count(vs, am) %>% adorn_totals(name = "Total", n)
输出结果:
vs am n 0 0 12 0 1 6 1 0 7 1 1 7 Total - 32
这种写法既简洁,又能仅对n列计算总计,am列的总计行会使用默认填充值-显示,符合需求。
如果需要更灵活的列选择(比如动态指定列名),可以结合tidyselect的选择器语法:
mtcars %>% count(vs, am) %>% adorn_totals(name = "Total", tidyselect::all_of("n"))
效果和直接传入n完全一致,适合列名需要动态生成的场景。
内容的提问来源于stack exchange,提问作者M Aurélio
相关产品推荐
相关产品推荐

