如何通过引用dplyr管道中的data.frame变量。以编程方式? 库(ggplot2) 图书馆(dplyr) 图书馆(比例尺) 数据% 分组人(主题名)%>% 总结(n=n())%>% 变异(频率=n/和(n))%>% #下一行# ggplot(,aes(x=重新排序(主题名称,描述(频率)),y=频率))+ 几何图形栏(stat=“identity”)+ 连续缩放(标签=百分比)
如何以编程方式引用主题名?我可以做如何通过引用dplyr管道中的data.frame变量。以编程方式? 库(ggplot2) 图书馆(dplyr) 图书馆(比例尺) 数据% 分组人(主题名)%>% 总结(n=n())%>% 变异(频率=n/和(n))%>% #下一行# ggplot(,aes(x=重新排序(主题名称,描述(频率)),y=频率))+ 几何图形栏(stat=“identity”)+ 连续缩放(标签=百分比),r,ggplot2,dplyr,R,Ggplot2,Dplyr,如何以编程方式引用主题名?我可以做$THEME\u NAME,但我想称之为[1]或选择(,1)或类似的东西 原因是我想在更大的上下文中使用这个管道——比如通过这个管道传递一堆因子变量。类似于:vars.to.plot就我所知,这必须分三部分完成。我发现有一些局限性,如果我错了,我会很感激有人纠正 library(ggplot2) library(dplyr) library(scales) data <- data.frame(THEME_NAME = c(rep("A", 10), r
$THEME\u NAME
,但我想称之为[1]
或选择(,1)
或类似的东西
原因是我想在更大的上下文中使用这个管道——比如通过这个管道传递一堆因子变量。类似于:
vars.to.plot就我所知,这必须分三部分完成。我发现有一些局限性,如果我错了,我会很感激有人纠正
library(ggplot2)
library(dplyr)
library(scales)
data <- data.frame(THEME_NAME = c(rep("A", 10), rep("B", 20), rep("C", 15)))
data %>%
group_by(THEME_NAME) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n)) %>%
# THE NEXT LINE !!! #
ggplot(., aes(x = reorder(THEME_NAME, desc(freq)), y = freq)) +
geom_bar(stat="identity") +
scale_y_continuous(labels=percent)
但对于接受字符串的版本,级别保持不变:
mutate(THEME_NAME = factor(THEME_NAME, levels=unique(THEME_NAME)))
因此,您需要设置一个变量来保存分组变量的名称,因为在调用summary()
之后,tbl\u df
对象中不会保留“group by”变量信息。你可以这样做
s_mutate(my_var = factor(my_var, levels = unique(my_var)))
这不需要这里分享的想法很有用,但这就是我最终实际做的:
data %>%
group_by(THEME_NAME) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n)) %>%
{ggplot(., eval(substitute(aes(x=reorder(X, desc(freq)), y=freq), list(X=as.name(names(.)[1]))))) +
geom_bar(stat="identity") +
scale_y_continuous(labels=percent)}
库(ggplot2)
图书馆(dplyr)
图书馆(比例尺)
对于初学者来说,ggplot(,aes_string(x=names(.)[1L],y=“freq”)
的数据是有效的,但是我还没有弄清楚如何将它与ggplot
内部的重新排序一起使用。谢谢@docendodiscimus+1-我想得越多,我觉得有更好的方法;可能是某个东西先输出一个列表,然后do
或do.call
或lappy
。我可能会调整这个例子来详细说明另一个因子变量。+1,我最终会将此标记为已回答,但我很好奇是否有其他人能想出更优雅的方法。我只是添加了一个替代方法,它选择第一列而不是使用变量。是的,看到了,这是一个不错的选择,但是“未来的我”如果我稍后阅读该代码,可能会丢失。如果您仍然在那里,请查看上面更详细的示例,该示例并非100%有效,但它抓住了问题的核心,并引入了更多问题,即不打印ggplot
对象,但我们正在脱离主题…嗯,默认情况下不会打印循环中的对象,因此需要显式调用print()
。不确定您可能还有哪些其他问题。
varname<-"THEME_NAME"
data %>%
group_by_(varname) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n)) %>%
ggplot(eval(bquote(aes(x=reorder(.(as.name(varname)), desc(freq)), y=freq)))) +
geom_bar(stat="identity") +
scale_y_continuous(labels=percent)
data %>%
group_by(THEME_NAME) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n)) %>%
{ggplot(., eval(substitute(aes(x=reorder(X, desc(freq)), y=freq), list(X=as.name(names(.)[1]))))) +
geom_bar(stat="identity") +
scale_y_continuous(labels=percent)}
library(ggplot2)
library(dplyr)
library(scales)
data <- data.frame(THEME_NAME = c(rep("A", 10), rep("B", 20), rep("C", 15)),
THEME_NAME_2 = c(rep("E", 5), rep("F", 40)),
Non_Factor = 1:45)
factor.vars <- sapply(data, is.factor)
varnames <- names(data)[factor.vars]
myReorder <- function(x) {
factor(x, levels=names(sort(table(x), decreasing=TRUE)))
}
for (i in seq_along(varnames)) {
data[, varnames[i]] <- myReorder(data[, varnames[i]])
}
for (i in seq_along(varnames)) {
print(ggplot(data, aes_string(x = varnames[i], y = "..count../sum(..count..)")) +
geom_histogram())
}