有时,在进行探索性分析或生成报告时,我们希望为许多变量绘制单变量分布。在经过一些整洁的伎俩之后,我可以通过这个方面来做这个问题,但是有条件的因素,我想让它们按照情节进行排序。
因此,为了更有效地完成它,我构建了一个简单的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))
}
我搜索了这个,但对我来说仍然不清楚。有人知道我做错了什么或者如何让它发挥作用?
提前致谢。
答案 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
答案 2 :(得分:1)
我想OP希望将plotUniCat
用于引用和未引用的变量名称。如果我们更改了该功能,则不适用于plotUniCat(Arthritis, Improved)
。
因此,我们也可以改变函数plotUniCat
的调用方式,而不是改变函数:
for (i in variables) {
plotUniCat(Arthritis, !!rlang::sym(i))
}
但是,这些图是由for
生成但不返回的。我们可以使用print
或lapply
强制显示或收集生成的图表:
lapply(variables, function(i) plotUniCat(Arthritis, !!rlang::sym(i)))