我想使用字符串形式的列名通过dplyr
和ggplot
处理数据框。这是我的代码
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()
}
上面的代码显然不起作用。所以我尝试了不同的内容,例如UQ
和as.name
。 UQ
创建带有额外引号的列,而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
答案 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)
我对您的代码进行了两处更改:
dplyr
中的“分组依据”变量,请使用group_by_
代替group_by
; ggplot2
中使用aes_string
或get(variable)
; 我还添加了一些细微的更改(例如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)
}