【发布时间】:2018-05-24 00:24:26
【问题描述】:
我有一个数据集,其中包含 16 个可用于构面的组 - 但是,这太多了,我想只保留最重要的组(取决于该组中某个总数的百分比)。例如,我想只保留代表 Var1 总数 30% 或更多的组。
为了说明,如果我运行以下代码,R 会正确输出两个物种,其 Petal.length 总和占数据集中 Petal.length 总和的 30% 以上(忽略在这种情况下这是一个毫无意义的统计数据)。
library(tidyverse)
iris %>%
group_by(Species) %>%
summarise(t_length = sum(Petal.Length),
p_length = round(100*t_length/sum(.$Petal.Length))) %>%
filter(p_length >=30)
所以,我想做的是让满足指定条件的所有组都有 ggplot 方面。在我的数据集中,16 个组中只有 5 个组捕获了超过 90% 的有趣观察,因此,我不需要分面网格中的其他 11 个组。
这是我的尝试,输出都是3种,应该只有上表中的2种:
iris.sub <- ggplot(subset(iris, round(100*sum(Petal.Length)/sum(iris$Petal.Length)) >= 30), aes(x = ' ', y = Petal.Length)) +
geom_point(stat = 'summary', fun.y = 'mean') +
geom_errorbar(stat = 'summary', fun.data = 'mean_se',
width=0, fun.args = list(mult = 1.96)) +
facet_grid( . ~ Species ) +
theme_bw()
iris.sub
【问题讨论】:
-
在绘图之前是否使用
dplyr::filter进行子集化不是一个选项? -
问题(除非我遗漏了什么)是第一个代码块中的
filter()应用于group_by创建的行;在第二个代码块中,我想应用相同的过滤器,但适用于个人观察。也就是说,我想绘制属于 2 个所需组的所有观察值,并在构面网格中仅显示这两个。 -
一种可能的解决方法是使用
mutate创建一个新列,并以此过滤,但我想知道在ggplot 中是否有更直接的方法。 -
我不知道是否可以使用
stat_summary或ggplot中的某些东西来完成,但我只能说适合这项工作的工具。而且你申请filter的方式不会受到group_by的影响。