我想用ggplot绘制没有异常值的箱形图,只关注盒子和胡须
例如:
p1 <- ggplot(diamonds, aes(x=cut, y=price, fill=cut))
p1 + geom_boxplot() + facet_wrap(~clarity, scales="free")
Run Code Online (Sandbox Code Playgroud)
给出带有异常值的刻面箱图

我可以用outlier.size = NA来抑制异常值:
p1 <- ggplot(diamonds, aes(x=cut, y=price, fill=cut))
p1 + geom_boxplot(outlier.size=NA) + facet_wrap(~clarity, scales="free")
Run Code Online (Sandbox Code Playgroud)
这使

这里,y轴刻度与原始绘图中的相同,只是异常值不显示.我现在如何根据晶须结束修改每个面板上的"放大"比例?
我可以像这样重置ylim
ylim1 = boxplot.stats(diamonds$price)$stats[c(1, 5)]
Run Code Online (Sandbox Code Playgroud)
然后重新绘制
p1 + geom_boxplot(outlier.size=NA)
+ facet_wrap(~clarity, scales="free")
+ coord_cartesian(ylim = ylim1*1.05)
Run Code Online (Sandbox Code Playgroud)
但这不适用于方面:

有没有办法"facet_wrap"boxplots.stats功能?
编辑:
我试图动态计算箱线图统计数据,但这似乎不起作用.
give.stats <- function(x){return(boxplot.stats(x)$stats[c(1,5)])}
p1 + geom_boxplot(outlier.size=NA) +
facet_wrap(~clarity, scales="free") +
coord_cartesian(ylim = give.stats)
> Error in min(x, na.rm = na.rm) : invalid 'type' (list) of argument
Run Code Online (Sandbox Code Playgroud)
任何更多的想法将不胜感激.
我经常需要根据因子变量的条件从数据框中的现有变量计算新变量.
编辑在2分钟内获得4个答案,我意识到我已经过度简化了我的例子.请看下面.
简单的例子:
df <- data.frame(value=c(1:5),class=letters[1:5])
df
value class
1 a
2 b
3 c
4 d
5 e
Run Code Online (Sandbox Code Playgroud)
我可以使用这样的代码
df %>%
mutate(result=NA) %>%
mutate(result=ifelse(class=="a",value*1,result)) %>%
mutate(result=ifelse(class=="b",value*2,result)) %>%
mutate(result=ifelse(class=="c",value*3,result)) %>%
mutate(result=ifelse(class=="d",value*4,result)) %>%
mutate(result=ifelse(class=="e",value*5,result))
Run Code Online (Sandbox Code Playgroud)
对我的变量执行条件计算,得到
value class result
1 a 1
2 b 4
3 c 9
4 d 16
5 e 25
Run Code Online (Sandbox Code Playgroud)
实际上,类的数量更大,计算更复杂,但是,我更喜欢更清洁的东西,就像这样
df %>%
mutate(results=switch(levels(class),
"a"=value*1,
"b"=value*2,
"c"=value*3,
"d"=value*4,
"e"=value*5))
Run Code Online (Sandbox Code Playgroud)
这显然不起作用
Error in switch(levels(1:5), a = 1:5 * 1, b = 1:5 * 2, c = 1:5 * …Run Code Online (Sandbox Code Playgroud) 我偶然发现了dplyr::filter大型数据帧上的复杂语句的行为,这基本上可以归结为NA值的处理:
df <- tibble(a = c(rep(1,3),
rep(NA, 3)))
A tibble: 6 x 1
a
<dbl>
1 1
2 1
3 1
4 NA
5 NA
6 NA
Run Code Online (Sandbox Code Playgroud)
过滤等于 1 的行可得到预期结果:
df %>% filter(a == 1)
A tibble: 3 x 1
a
<dbl>
1 1
2 1
3 1
Run Code Online (Sandbox Code Playgroud)
过滤不等于 1 的行,我希望返回 df 的剩余 3 行,但事实并非如此:
df %>% filter(!a == 1)
A tibble: 0 x 1
... with 1 variables: a <dbl>
Run Code Online (Sandbox Code Playgroud)
因此,虽然在第一种情况下NA被解释为不等于 1,但在第二种情况下,它被解释为等于 1。我在这里缺少逻辑吗? …