5

有时在执行探索性分析或生成报告时,我们希望绘制许多变量的单变量分布。经过一些整洁的技巧后,我可以在情节上做到这一点,但是有有序的因素,我想让它们在情节上保持有序。

因此,为了以更有效的方式完成它,我构建了一个简单的dplyr/ggplot基于函数。我在下面使用vcd包的关节炎数据集制作了这个例子。

library(dplyr)
library(ggplot2)

data(Arthritis, package = "vcd")

head(Arthritis)

plotUniCat <- function(df, x) {
  x <- enquo(x)
  df %>%
    filter(!is.na(!!x)) %>%
    count(!!x) %>%
    mutate(prop = prop.table(n)) %>%
    ggplot(aes(y=prop, x=!!x)) +
    geom_bar(stat = "identity")
}

plotUniCat(Arthritis, Improved)

我可以用很短的方式绘制一个格式化的图表,这很酷,但只有一个变量。

我试图用 for 循环调用多个变量,但它不起作用。代码运行,但没有任何反应。

variables <- c("Improved", "Sex", "Treatment")

for (i in variables) {
  plotUniCat(Arthritis, noquote(i))
}

我对此进行了搜索,但对我来说仍然不清楚。有人知道我做错了什么或如何使它工作吗?

提前致谢。

4

3 回答 3

5

您需要使用rlang::sym将字符串转换为符号而不是enquo. 我用for循环替换purrr::map循环variables

library(tidyverse)

data(Arthritis, package = "vcd")

head(Arthritis)
#>   ID Treatment  Sex Age Improved
#> 1 57   Treated Male  27     Some
#> 2 46   Treated Male  29     None
#> 3 77   Treated Male  30     None
#> 4 17   Treated Male  32   Marked
#> 5 36   Treated Male  46   Marked
#> 6 23   Treated Male  58   Marked

plotUniCat2 <- function(df, x) {
  x <- rlang::sym(x)
  df %>%
    filter(!is.na(!!x)) %>%
    count(!!x) %>%
    mutate(prop = prop.table(n)) %>%
    ggplot(aes(y=prop, x=!!x)) +
    geom_bar(stat = "identity")
}

variables <- c("Improved", "Sex", "Treatment")

variables %>% purrr::map(., ~ plotUniCat2(Arthritis, .x))
#> [[1]]

#> 
#> [[2]]

#> 
#> [[3]]

reprex 包(v0.2.0)于 2018 年 6 月 13 日创建。

于 2018-06-14T01:50:09.723 回答
4

enquo将函数中的更改为sym, 以将变量字符串转换为符号。那是,

plotUniCat <- function(df, x) {
  x <- sym(x)
  df %>%
    filter(!is.na(!!x)) %>%
    count(!!x) %>%
    mutate(prop = prop.table(n)) %>%
    ggplot(aes(y=prop, x=!!x)) +
    geom_bar(stat = "identity")
}

或者,更简洁地说,

plotUniCat <- function(df, x) {
  x <- sym(x)
  df %>%
    filter(!is.na(!!x)) %>%
    ggplot(aes(x = as.factor(!!x))) +
    geom_histogram(stat = "count")
}

进而

out <- lapply(variables, function(i) plotUniCat(Arthritis,i))

最后,用于grid.arrange显示绘图。例如

library(gridExtra)
do.call(grid.arrange, c(out, ncol = 2))

在此处输入图像描述

于 2018-06-14T01:47:33.750 回答
1

我猜 OP 想同时使用带plotUniCat引号和不带引号的变量名。如果我们更改函数,它将无法用于plotUniCat(Arthritis, Improved).

因此,除了更改函数之外,我们还可以将调用函数的方式更改plotUniCat为:

for (i in variables) {
    plotUniCat(Arthritis, !!rlang::sym(i))
}

但是,这些图是由 生成但不返回的for。我们可以使用printorlapply来强制显示或收集生成的图:

lapply(variables, function(i) plotUniCat(Arthritis, !!rlang::sym(i)))
于 2018-06-14T03:40:56.790 回答