ggplot和dplyr以及列名称为字符串

时间:2017-09-22 20:24:27

标签: r string ggplot2 dplyr

我想使用字符串形式的列名通过dplyrggplot处理数据框。这是我的代码

library(ggplot2)
library(dplyr)
my_df <- data.frame(var_1 = sample(c('a', 'b', 'c'), 1000, replace = TRUE),
                    var_2 = sample(c('d', 'e', 'f'), 1000, replace = TRUE))

name_list = c('var_1', 'var_2')

for(el in name_list){
  pdf(paste(el, '.pdf', sep =''))
    test <- my_df %>% group_by(el) %>% summarize(count = n())
    ggplot(data = test, aes(x = el, y = count)) + geom_bar(stat='identity')
  dev.off()
}

上面的代码显然不起作用。所以我尝试了不同的内容,例如UQas.nameUQ创建带有额外引号的列,而ggplot不会使用aes_string来理解它。有什么建议吗?

我可以使用for (el in names(my_df))进行过滤,但更喜欢使用字符串。

更新 以下是我收到的详细消息/错误:

for(el in name_list){
  pdf(paste(el, '.pdf', sep =''))
    test <- my_df %>% group_by(!!el) %>% summarize(count = n())
    ggplot(data = test, aes_string(x = el, y = 'count')) + geom_bar(stat='identity')
  dev.off()
}

以上代码生成空文件。

for(el in name_list){
  pdf(paste(el, '.pdf', sep =''))
    test <- my_df %>% group_by(UQ(el)) %>% summarize(count = n())
    ggplot(data = test, aes_string(x = el, y = 'count')) + geom_bar(stat='identity')
  dev.off()
}

以上代码也会生成空文件

for(el in name_list){
  pdf(paste(el, '.pdf', sep =''))
    test <- my_df %>% group_by(as.name(el)) %>% summarize(count = n())
    ggplot(data = test, aes_string(x = el, y = 'count')) + geom_bar(stat='identity')
  dev.off()
}

生成

Error in mutate_impl(.data, dots) : 
  Column `as.name(el)` is of unsupported type symbol

2 个答案:

答案 0 :(得分:2)

您需要UQ(或!!)名称/符号。例如

for(el in name_list){
  pdf(paste(el, '.pdf', sep =''))
  test <- my_df %>% group_by(UQ(as.name(el))) %>% summarize(count = n())
  print(ggplot(data = test, aes_string(x = el, y = 'count')) + geom_bar(stat='identity'))
  dev.off()
}

答案 1 :(得分:1)

我对您的代码进行了两处更改:

  1. dplyr中的“分组依据”变量,请使用group_by_代替group_by;
  2. 要在ggplot2中使用aes_stringget(variable);
  3. 调用变量

    我还添加了一些细微的更改(例如ggsave以保存地块)。

    library(ggplot2)
    library(dplyr)
    my_df <- data.frame(var_1 = sample(c('a', 'b', 'c'), 1000, replace = TRUE),
                        var_2 = sample(c('d', 'e', 'f'), 1000, replace = TRUE))
    
    name_list = c('var_1', 'var_2')
    
    for(el in name_list){
        p <- my_df %>% 
             group_by_(el) %>% 
             summarize(count = n()) %>%
             ggplot(aes(x = get(el), y = count)) +
                 geom_bar(stat = "identity")
        ggsave(paste0(el, ".pdf"), p)
    }