我想根据值term
为变量val
绘制以下数据帧,并按gr
刻面
我使用Windows 10 64位,R 3.4.3 64位。
我已经尝试了fct_reorder
软件包中的forcats
,但没有成功。
library(tidyverse)
df = data_frame(gr = c(rep('foo',3), rep('bar',3),
rep('cron',3)), term = c('a','b','c', 'd', 'a','e', 'f', 'g', 'h'),
val = c(4,5,6,1.5,1,3,1,2,4))
df %>%
group_by(gr) %>%
arrange(desc(val)) %>%
ungroup() %>%
mutate(term = reorder(term, val)) %>%
ggplot(aes(term, val, fill = gr)) +
geom_col(position = 'identity') +
facet_wrap(~gr, scales = 'free') +
ylab('')+
coord_flip()
期望是术语a
在foo
和bar
组的底部。
但是,在情节中,组bar
的顺序不正确,如中间的情节。
答案 0 :(得分:0)
@Camille的评论是关键。但是您是对的-它需要另一种方法处理另一个数据框-一种方法是根据您的评论进行更新的。
我使用rank
代替了arrange
,并且正在介绍帮助器列。这有点“危险”,因为新列的位置不再对应于旧列。因此,我将其存储在一个新的数据框中,以免更改基础数据,并且也不会造成混淆。
然后,我根据@Camille的建议(以及取消分组后的操作,如您所做的那样)创建了因式列term_f
。
一些警告:
只需使用reorder(term, val, FUN = min)
,即不使用desc(val)
library(tidyverse)
df = data_frame(gr = c(rep('foo',3), rep('bar',3), rep('cron',3)), term = c('a','b','c', 'd', 'a','e', 'f', 'g', 'h'), val = c(4,3,6,1.5,1,3,1,2,4))
df_f <-
df %>% group_by(gr) %>%
mutate(rank_val = val[rank(val)],
rank_term = term[rank(val)]) %>%
ungroup() %>%
mutate(term_f = fct_inorder(rank_term))
df_f
#> # A tibble: 9 x 6
#> gr term val rank_val rank_term term_f
#> <chr> <chr> <dbl> <dbl> <chr> <fct>
#> 1 foo a 4 3 b b
#> 2 foo b 3 4 a a
#> 3 foo c 6 6 c c
#> 4 bar d 1.5 1 a a
#> 5 bar a 1 1.5 d d
#> 6 bar e 3 3 e e
#> 7 cron f 1 1 f f
#> 8 cron g 2 2 g g
#> 9 cron h 4 4 h h
ggplot(data = df_f, aes(term_f, rank_val)) +
geom_col() +
facet_wrap(~ gr, scales = 'free') +
coord_flip()
由reprex package(v0.2.0)于2018年12月23日创建。