【问题标题】:Loop to create crosstabs of columns using tidyr循环使用 tidyr 创建列的交叉表
【发布时间】:2021-11-20 00:15:04
【问题描述】:

我想使用循环来创建一列与 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)
}

这会返回Column `c` is not found.

这似乎应该很简单,但我想不通。感谢您的帮助。

【问题讨论】:

  • 在循环中使用!!sym(c) 而不是c。见https://rlang.r-lib.org/reference/bang-bang.html

标签: r tidyverse tidyr


【解决方案1】:

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

【讨论】:

  • 这行得通,谢谢!我明白了为什么代码需要这样的要点,但需要阅读更多相关信息。
【解决方案2】:

在将列名作为字符串传递时,您可以使用.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)
}

【讨论】:

  • 这很有帮助,谢谢!我需要更熟悉 tidy 中的代词用法。
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2017-03-24
相关资源
最近更新 更多