运行 使用 tabyl 的多个交叉表

Run multiple crosstabs using tabyl

我有这样的数据:

dat <- mtcars %>% mutate(cyl2 = cyl*2,cyl3 = cyl*3)

我想运行以下每个交叉表 [vs,cyl] [vs,cyl1] [vs,cyl2] [vs,cyl3] 使用 tabyl:

我知道我可以 运行 vs, cyl 这样,并为每个 'cyl' 变量重复此操作。但是我想形成某种循环而不是重复这个。

dat%>% 
  tabyl(vs,cyl)%>%
  adorn_percentages("row") %>%
  adorn_pct_formatting(digits = 2) %>%
  adorn_ns()

所以我做了一个函数:

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

我 运行 遇到了一些问题,非常感谢任何帮助!!

  1. 该函数不接受 v1 作为参考变量。为什么是这样?我试着用 enquo 包装它,但没有任何区别。

    错误:必须按在 .data 中找到的变量分组。* 未找到列 v1

  2. 我该如何设置才能使用类似这样的东西来减少重复:

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

对于多列,循环遍历列名,即 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)

或者如果我们想要以列作为标识符的单个数据输出

library(purrr)
library(dplyr)
imap_dfr(lst('cyl','cyl2','cyl3'), ~ run_xtable(data = dat, v1 = .x) %>%
         mutate(grp = .y, .before = 1))