使用 tabyl 运行多个交叉表

New*_*Bee 3 r dplyr janitor

我有这样的数据:

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)

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

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

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

  2. 我如何设置它,以便我可以使用类似的东西来减少重复:

    sapply(run_xtable, c('cyl','cyl1','cyl2'))

谢谢你!

akr*_*run 5

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

  • 你动作快如闪电,谢谢!! (2认同)