首页 > 解决方案 > 使用 count() 和 factor() 函数时,如何在 R ggplot 中使用动态声明的变量?

问题描述

我想以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,然后使用它来检索“数据”中该变量的数据。

通过一些研究,我发现了类似 using 的建议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 中使用以下包:tidyverseggplot2

标签: rdplyr

解决方案


使用代词将具有as 变量.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()

推荐阅读