r dplyr 非标准评估 - 在函数中排序条形图
r dplyr non standard evaluation - ordering bar plot in a function
我已经阅读 http://dplyr.tidyverse.org/articles/programming.html 关于 dplyr 中的非标准评估,但仍然无法正常工作。
plot_column <- "columnA"
raw_data %>%
group_by(.dots = plot_column) %>%
summarise (percentage = mean(columnB)) %>%
filter(percentage > 0) %>%
arrange(percentage) %>%
# mutate(!!plot_column := factor(!!plot_column, !!plot_column))%>%
ggplot() + aes_string(x=plot_column, y="percentage") +
geom_bar(stat="identity", width = 0.5) +
coord_flip()
禁用 mutate 语句时工作正常。但是,当启用它以便按高度对条形进行排序时,只返回一个条形。
如何将上面的语句转换为函数/以使用变量但仍绘制按大小排序的多个条。
示例数据集可以是:
columnA,columnB
a, 1
a, 0.4
a, 0.3
b, 0.5
编辑
样本:
mtcars %>%
group_by(mpg) %>%
summarise (mean_col = mean(cyl)) %>%
filter(mean_col > 0) %>%
arrange(mean_col) %>%
mutate(mpg := factor(mpg, mpg))%>%
ggplot() + aes(x=mpg, y=mean_col) +
geom_bar(stat="identity")
coord_flip()
将输出有序条形图。
我怎样才能将它包装到一个函数中,在该函数中可以替换该列并获得多个条形图?
这适用于 dplyr 0.7.0 和 ggplot 2.2.1:
rm(list = ls())
library(ggplot2)
library(dplyr)
raw_data <- tibble(columnA = c("a", "a", "b", "b"), columnB = c(1, 0.4, 0.3, 0.5))
plot_col <- function(df, plot_column, val_column){
pc <- enquo(plot_column)
vc <- enquo(val_column)
pc_name <- quo_name(pc) # generate a name from the enquoted statement!
df <- df %>%
group_by(!!pc) %>%
summarise (percentage = mean(!!vc)) %>%
filter(percentage > 0) %>%
arrange(percentage) %>%
mutate(!!pc_name := factor(!!pc, !!pc)) # insert pc_name here!
ggplot(df) + aes_(y = ~percentage, x = substitute(plot_column)) +
geom_bar(stat="identity", width = 0.5) +
coord_flip()
}
plot_col(raw_data, columnA, columnB)
plot_col(mtcars, mpg, cyl)
我 运行 遇到的问题是 ggplot 和 dplyr 使用不同类型的非标准评估。我得到了这个问题的答案:Creating a function using ggplot2 .
编辑:参数化值列(例如columnB/cyl)并添加 mtcars 示例。
我已经阅读 http://dplyr.tidyverse.org/articles/programming.html 关于 dplyr 中的非标准评估,但仍然无法正常工作。
plot_column <- "columnA"
raw_data %>%
group_by(.dots = plot_column) %>%
summarise (percentage = mean(columnB)) %>%
filter(percentage > 0) %>%
arrange(percentage) %>%
# mutate(!!plot_column := factor(!!plot_column, !!plot_column))%>%
ggplot() + aes_string(x=plot_column, y="percentage") +
geom_bar(stat="identity", width = 0.5) +
coord_flip()
禁用 mutate 语句时工作正常。但是,当启用它以便按高度对条形进行排序时,只返回一个条形。
如何将上面的语句转换为函数/以使用变量但仍绘制按大小排序的多个条。
示例数据集可以是:
columnA,columnB
a, 1
a, 0.4
a, 0.3
b, 0.5
编辑
样本:
mtcars %>%
group_by(mpg) %>%
summarise (mean_col = mean(cyl)) %>%
filter(mean_col > 0) %>%
arrange(mean_col) %>%
mutate(mpg := factor(mpg, mpg))%>%
ggplot() + aes(x=mpg, y=mean_col) +
geom_bar(stat="identity")
coord_flip()
将输出有序条形图。 我怎样才能将它包装到一个函数中,在该函数中可以替换该列并获得多个条形图?
这适用于 dplyr 0.7.0 和 ggplot 2.2.1:
rm(list = ls())
library(ggplot2)
library(dplyr)
raw_data <- tibble(columnA = c("a", "a", "b", "b"), columnB = c(1, 0.4, 0.3, 0.5))
plot_col <- function(df, plot_column, val_column){
pc <- enquo(plot_column)
vc <- enquo(val_column)
pc_name <- quo_name(pc) # generate a name from the enquoted statement!
df <- df %>%
group_by(!!pc) %>%
summarise (percentage = mean(!!vc)) %>%
filter(percentage > 0) %>%
arrange(percentage) %>%
mutate(!!pc_name := factor(!!pc, !!pc)) # insert pc_name here!
ggplot(df) + aes_(y = ~percentage, x = substitute(plot_column)) +
geom_bar(stat="identity", width = 0.5) +
coord_flip()
}
plot_col(raw_data, columnA, columnB)
plot_col(mtcars, mpg, cyl)
我 运行 遇到的问题是 ggplot 和 dplyr 使用不同类型的非标准评估。我得到了这个问题的答案:Creating a function using ggplot2 .
编辑:参数化值列(例如columnB/cyl)并添加 mtcars 示例。