使用 tidyr 循环创建列的交叉表

Loop to create crosstabs of columns using tidyr

我想使用循环在 df 中创建一列与其他所有列的交叉表。我从这段代码开始(替换为 iris df),它适用于两个变量:

iris <- iris
tbl <- iris %>% 
  tabyl(Species, Sepal.Length, show_missing_levels = FALSE, show_na = FALSE) %>%
  adorn_percentages("row") %>%
  adorn_pct_formatting(digits = 0) %>%
  adorn_ns() %>%
  adorn_title("combined") %>%
  knitr::kable()
print(tbl)

我的 df 包含约 200 列。我想我会写一个 for 循环来打印一个变量与其他每个变量的交叉表。这是我尝试过的:

cols <- c('Sepal.Length', 'Sepal.Width')
for (c in cols){
  tbl <- iris %>% 
    tabyl(Species, c, show_missing_levels = FALSE, show_na = FALSE) %>%
    adorn_percentages("row") %>%
    adorn_pct_formatting(digits = 0) %>%
    adorn_ns() %>%
    adorn_title("combined") %>%
    knitr::kable()
  print(tbl)
}

这个returnsColumn `c` is not found.

这看起来应该很简单,但我想不通。感谢您的帮助。

将代码中的 c 更改为 !!sym(c)。我无法解释这种非标准的 tidyverse 评估,但用外行的话来说,您想访问管道(iris)之外的对象(即“c”)。这就是为什么你需要 !!sym.

将列名称作为字符串传递时,您可以使用 .data 代词。

cols <- c('Sepal.Length', 'Sepal.Width')

for (col in cols){
  tbl <- iris %>% 
    tabyl(Species, .data[[col]],show_missing_levels = FALSE,show_na = FALSE) %>%
    adorn_percentages("row") %>%
    adorn_pct_formatting(digits = 0) %>%
    adorn_ns() %>%
    adorn_title("combined") %>%
    knitr::kable()
  print(tbl)
}