使用dplyr / ggplot函数

时间:2018-06-14 01:10:06

标签: r ggplot2 dplyr tidyeval

有时,在进行探索性分析或生成报告时,我们希望为许多变量绘制单变量分布。在经过一些整洁的伎俩之后,我可以通过这个方面来做这个问题,但是有条件的因素,我想让它们按照情节进行排序。

因此,为了更有效地完成它,我构建了一个简单的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))
}

我搜索了这个,但对我来说仍然不清楚。有人知道我做错了什么或者如何让它发挥作用?

提前致谢。

3 个答案:

答案 0 :(得分: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 package(v0.2.0)创建于2018-06-13。

答案 1 :(得分:4)

将函数中的def filePath = "/content/corporate/reports/output.csv" File output = new File(filePath) output.append('Hello world!') 更改为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)) 显示图表。 E.g。

grid.arrange

enter image description here

答案 2 :(得分:1)

我想OP希望将plotUniCat用于引用和未引用的变量名称。如果我们更改了该功能,则不适用于plotUniCat(Arthritis, Improved)

因此,我们也可以改变函数plotUniCat的调用方式,而不是改变函数:

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

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

lapply(variables, function(i) plotUniCat(Arthritis, !!rlang::sym(i)))