我的具体问题涉及
tabyl
包中的 janitor
功能,但它也可能与其他情况相关。
我试图将一个以列名作为参数的字符向量传递给创建汇总表的自定义函数。我应该能够传递 1、2 或 3 个名称,因为
tabyl
函数可以接受其中任何一个。但是,tabyl
仅将我的向量识别为单个参数,使用第一个元素并忽略其他元素。
我更喜欢向自定义函数提供向量而不是单个名称的原因是因为我正在对向量进行其他操作。
我尝试使用
do.call
来提取向量元素,就像在其他解决方案中一样,但很难将其与 tidyselect
命令 all_of
组合在一起,我可能需要将字符元素解释为列名称。
我的代码目前是:
library("tidyverse")
library("janitor")
table_func <- function(data=NULL,
vars=NULL) {
data %>% tabyl(all_of(vars))
# Other code involving "all_of(vars)"
}
dat <- tibble(x=c(1:4),y=c(5:8))
vc <- c("x","y")
table_func(dat,vc)
电流输出:
x n percent
1 1 0.25
2 1 0.25
3 1 0.25
4 1 0.25
所需输出:
x 5 6 7 8
1 1 0 0 0
2 0 1 0 0
3 0 0 1 0
4 0 0 0 1
如果
tabyl()
是 dplyr::select()
,那么这将起作用,但显然 janitor
包或此函数不支持相同的整洁选择语法。
当我陷入这种整洁的评估厄运坑时,我试图用基础R来摆脱困境。
你想调用:
tabyl(data, ...)
,其中...
是vars
中的变量作为名称。您可以使用 do.call()
来做到这一点:
table_func <- function(data, vars) {
tabyl |>
do.call(c(list(data), lapply(vars, as.name)))
}
table_func(dat, vc)
# x 5 6 7 8
# 1 1 0 0 0
# 2 0 1 0 0
# 3 0 0 1 0
# 4 0 0 0 1