我有这样的数据:
dat <- mtcars %>% mutate(cyl2 = cyl*2,cyl3 = cyl*3)
Run Code Online (Sandbox Code Playgroud)
我想使用 tabyl 运行以下每个交叉表 [vs,cyl] [vs,cyl1] [vs,cyl2] [vs,cyl3]:
我知道我可以运行 vs, cyl 这样的命令,并对每个“cyl”变量重复此操作。不过我想形成某种循环而不是重复这个。
dat%>%
tabyl(vs,cyl)%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
Run Code Online (Sandbox Code Playgroud)
所以我研究了一个函数:
run_xtable <- function(data,v1) {
out <- data%>%
tabyl(vs,v1)%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
return(out)
}
run_xtable(dat,'cyl')
Run Code Online (Sandbox Code Playgroud)
我遇到了一些问题,非常感谢任何帮助!
该函数不接受 v1 作为引用变量。为什么是这样?我尝试用 enquo 包裹它,但没有任何区别。
错误:必须按.data.*中找到的变量进行分组v1,未找到列。
我如何设置它,以便我可以使用类似的东西来减少重复:
sapply(run_xtable, c('cyl','cyl1','cyl2'))
谢谢你!
我们可以将 v1 的输入字符串转换为symbol 并求值 ( !!)
run_xtable <- function(data,v1) {
out <- data%>%
tabyl(vs, !! rlang::sym(v1))%>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
return(out)
}
Run Code Online (Sandbox Code Playgroud)
-测试
run_xtable(dat,'cyl')
# vs 4 6 8
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
Run Code Online (Sandbox Code Playgroud)
对于多列,循环列名,即 v1
lapply(c('cyl','cyl2','cyl3'), run_xtable, data = dat)
#[[1]]
# vs 4 6 8
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
#[[2]]
# vs 12 16 8
# 0 16.67% (3) 77.78% (14) 5.56% (1)
# 1 28.57% (4) 0.00% (0) 71.43% (10)
#[[3]]
# vs 12 18 24
# 0 5.56% (1) 16.67% (3) 77.78% (14)
# 1 71.43% (10) 28.57% (4) 0.00% (0)
Run Code Online (Sandbox Code Playgroud)
或者,如果我们想要以列作为标识符的单个数据输出
library(purrr)
library(dplyr)
imap_dfr(lst('cyl','cyl2','cyl3'), ~ run_xtable(data = dat, v1 = .x) %>%
mutate(grp = .y, .before = 1))
Run Code Online (Sandbox Code Playgroud)