我想以更有效的方式使用ggplot
绘制一些相对频率数据。
我有许多感兴趣的变量,并想为每个变量绘制一个单独的条形图。以下是我感兴趣的一个变量Gender
:的当前代码
chart.gender <- data %>%
count(Gender = factor(Gender)) %>%
mutate(Gender = fct_reorder(Gender,desc(n))) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x=Gender, y=n, fill=Gender)) +
geom_col()
这是有效的,但是变量Gender
被重复多次。由于我需要用类似的代码重复许多感兴趣的变量(性别、年龄、位置等(的绘图,我想通过在顶部声明一次感兴趣的可变变量并在代码的其余部分使用该声明的可变变量来简化这一点。直觉上,类似于:
var <- "Gender"
chart.gender <- data %>%
count(var = factor(var)) %>%
mutate(var = fct_reorder(var,desc(n))) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x=var, y=n, fill=var)) +
geom_col()
这并没有导致性别频率的三级因素计数图,而只是一个名为"性别"的单列。我相信我明白了为什么它不起作用,但我不知道它的解决方案:我希望R检索我存储在var
中的变量名,然后用它在"data"中检索该变量的数据。
通过一些研究,我发现了使用as.name(var)
之类的建议,但似乎(至少(在将变量var
声明为count()
函数中的一个因子时存在问题。
一些可重复的数据:
library(tidyverse)
library(ggplot2)
set.seed(1)
data <- data.frame(sample(c("Male", "Female", "Prefer not to say"),20,replace=TRUE))
colnames(data) <- c("Gender")
我在R中使用以下软件包:tidyverse
、ggplot2
使用.data
发音以var
为变量对列进行子集设置。
library(tidyverse)
var <- "Gender"
data %>%
count(var = factor(.data[[var]])) %>%
mutate(var = fct_reorder(var,desc(n))) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x=var, y=n, fill=var)) +
geom_col()
或者另一种方式是使用sym
和!!
data %>%
count(var = factor(!!sym(var))) %>%
mutate(var = fct_reorder(var,desc(n))) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x=var, y=n, fill=var)) +
geom_col()
如果在初始设置变量时使用as.name()
,则可以使用!!("bang-bang"(来取消对count()
步骤的变量的引用。
var <- as.name("Gender")
chart.gender <- data %>%
count(var = factor(!! var)) %>%
mutate(var = fct_reorder(var,desc(n))) %>%
mutate(pct = prop.table(n)) %>%
ggplot(aes(x=var, y=n, fill=var)) +
geom_col()