是合并这里所需的数据框

时间:2016-07-14 19:15:32

标签: r ggplot2 dplyr

我有一个数据框,我想在"值"中绘制3条线。 向量。前两行是由" group"组成的值向量。第3行是UNGROUPED值向量。我目前正在这样做的方法是对DPLYR进行2次调用并创建2个数据帧,然后合并它们,然后绘制合并的数据帧。是否有一种更简单的方法可以避免2次调用DPLYR?

d = data.frame(ym = rep(c(20011,20012,20023),3), group = c(0,0,1,0,1,0,1,0,1), value = c(1,2,3,4,2,1,3,3,2)) 

############### 1st call to dplyr  to create plot with 2 lines grouped by "group" 
d2 = d %>%
  group_by(ym,group)  %>%
  summarise(
    Value = mean(value)
  )
d2= as.data.frame(d2)
d2
ggplot(data=d2 , aes(x=ym, y=Value, group=as.factor(group),  colour = as.factor(group))) +
  geom_line()  + geom_point() 


  ###second call to dplyr to create a second data frame just for the UNGROUPED data
  d3 = d %>%
  group_by(ym)  %>%
  summarise(
    Value = mean(value)
  )

  #### merge the  data  TWO frames
d3 =as.data.frame(d3)
d3$group=2
d4 = rbind(d2,d3) 

### plot all 3 lines
ggplot(data=d4 , aes(x=ym, y=Value, group=as.factor(group),  colour = as.factor(group))) +
  geom_line()  + geom_point() 

1 个答案:

答案 0 :(得分:1)

你可以在一个dplyr链中完成,但是(AFAIK)它仍然需要两个单独的操作:

d2 = bind_rows(
  d %>%
    group_by(ym, group=as.character(group))  %>%
    summarise(Value = mean(value)),
  d %>%
    group_by(ym)  %>%
    summarise(Value = mean(value),
              group = "All"))

添加group=as.character(group)时,必须使用代码group="All"来避免错误,因为bind_rows无法自动将group从数字强制转换为字符。 (当分组列已经是因子或字符时,这一步当然是不必要的。)

然后,为了绘图,您可以突出显示平均线,以便它与各个组分开。我们仅映射到shape,以便能够移除All行的点标记:

ggplot(d2 , aes(x=ym, y=Value, colour=group)) +
  geom_line(aes(size=group)) + 
  geom_point(aes(shape=group)) +
  scale_color_manual(values=c(hcl(c(15,195),100,65), "black")) +
  scale_shape_manual(values=c(16,16,NA)) +
  scale_size_manual(values=c(0.7,0.7,1.5))

enter image description here