R直方图按间隔分组

时间:2018-02-20 21:05:21

标签: r ggplot2

我现在正在学习R,我需要找到一种方法来获取这样的数据框

m b
1 5
2 9
3 14
4 5
5 7
6 9

到这个

m b length
1 5 short
2 9 short
3 14 medium
4 5 medium
5 7 long
6 9 long

其中长度列的标准基于m列中的数字(1-2短,3-4中,5-6长)

我想这样做的原因所以我可以使用ggplot直方图并按长度分组并创建一个躲闪的直方图

实际上,如果我可以跳过创建一个新列,那就更好了。但我无法在ggplot

中看到如何做到这一点

例如,我想做ggplot(df,aes(b,group=length,fill=length))+geom_histogram(position="dodge",binwidth=2)

之类的事情

2 个答案:

答案 0 :(得分:2)

您可以使用cut

执行此操作
cut(df$m, breaks = c(0,2.5,4.5,Inf), labels=c('short', 'medium', 'long'))
[1] short  short  medium medium long   long  
Levels: short medium long

答案 1 :(得分:0)

一种选择可能是使用mutate中的betweendplyr来添加另一列length

步骤可以是:

library(dplyr)
# data
df <- read.table(text = "m b
1 5
2 9
3 14
4 5
5 7
6 9", header = T, stringsAsFactors = F)

df <- df %>% mutate(length = ifelse(between(m,1,2), "short",
                             ifelse(between(m,3,4),"medium","long")))

#Result

#  m  b length
#1 1  5  short
#2 2  9  short
#3 3 14 medium
#4 4  5 medium
#5 5  7   long
#6 6  9   lon

可以避免添加新列length。只需将length替换为factor(ceiling(m/2))来电中的ggplot

因此呼叫将是:

  ggplot(df,aes(b,group=factor(ceiling(m/2)),
  fill=factor(ceiling(m/2), labels = c("Short","Medium", "Long"))))+
  geom_histogram(position="dodge",binwidth=2)+
  labs(fill = "Length")

但是你必须手动命名legend

enter image description here