首页 > 解决方案 > 使用 tabyl 运行多个交叉表

问题描述

我有这样的数据:

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

我想使用 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_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'))

谢谢!

标签: rdplyrjanitor

解决方案


我们可以将 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))

推荐阅读