2016-07-14 9 views
1

Ich habe einen Datenrahmen und ich möchte 3 Zeilen alle aus dem "Value" Vektor. Die ersten beiden Zeilen sind der Wertvektor, der durch die "Gruppe" gruppiert ist, und die dritte Zeile ist der UNGROUPED-Wertvektor. Die Art, wie ich es gerade mache, besteht darin, zwei Aufrufe von DPLYR auszuführen und zwei Datenrahmen zu erzeugen, diese dann zusammenzufassen und dann den zusammengeführten Datenrahmen zu zeichnen. Gibt es einen einfacheren Weg, der 2 Aufrufe an DPLYR vermeidet?ist das Zusammenführen von Datenrahmen notwendig hier

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() 
+0

Der Betrieb und nicht als „Fusion“ ist „Stapel“. – eipi10

Antwort

1

Man konnte es in einer einzigen dplyr Kette, aber (AFAIK) es erfordert noch zwei getrennte Operationen:

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")) 

Der Code group=as.character(group) ist notwendig, um einen Fehler zu vermeiden, wenn Sie group="All" hinzufügen, weil bind_rows wird group nicht automatisch von numerisch zu Zeichen erzwingen. (Dieser Schritt ist natürlich nicht notwendig, wenn die Gruppierungsspalte bereits Faktor oder Zeichen ist.)

Dann können Sie zum Plotten die durchschnittliche Linie markieren, so dass sie von den einzelnen Gruppen getrennt ist. Wir bilden zu shape nur die Punktmarken für die All Linie entfernen können:

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)) 

in diesem Fall enter image description here