2017-10-23 3 views
0

So habe ich zwei Systeme, die zwei Benchmarks ausführen, von denen ich zwei Metriken sammeln.Zusammenfassung hinzufügen mittlere Zeile in R Datenrahmen mit dplyr

df1 <- data.frame(Benchmark = c("Benchmark1", "Benchmark2"), 
       Metric1 = c(120, 200), 
       Metric2 = c(200, 150)) 
df2 <- data.frame(Benchmark = c("Benchmark1", "Benchmark2"), 
       Metric1 = c(100, 150), 
       Metric2 = c(200, 180)) 

Jetzt bereite ich diesen Datenrahmen für mit ggplot Plotten

df <- left_join(df1, df2, by = "Benchmark") %>% 
    gather(Metric,Value,2:5) %>% 
    mutate(System = ifelse(grepl(".x", Metric), "System1", "System2"), 
     Metric = ifelse(grepl("1" , Metric), "Metric1", "Metric2")) 

Und ich kann ein schönes Diagramm wie diese

ggplot(df %>% filter(Metric == "Metric1"), aes(x = Benchmark, y = Value, fill = System)) + 
     geom_col(position = "dodge") 

Nice chart

Jetzt bekomme ich mag eine hinzufügen neue Reihe von Balken mit der Geometrie dieser Metriken für jedes dieser Systeme.

Mein Datenframe muss 2 x 2 = 4 neue Zeilen für jede (System, Metrik) -Kombination enthalten, die die Geometrie der Werte der Benchmarks für jede Kombination (System, Metrik) enthält.

Ich weiß, dass ich Base R verwenden kann, um Datenrahmenspalten auszuwählen, die einem Kriterium entsprechen, den Mittelwert zu erhalten und dann manuell neue Zeilen mit bind_rows einzugeben. Gibt es einen automatisierten Weg dies mit dplyr zu erreichen? Vielleicht mit einer Kombination von group_by() mit anderen Funktionen?

Vielen Dank im Voraus.

Antwort

2

Sind Sie auf der Suche nach so etwas?

wrangled-Datensatz:

library(dplyr) 
library(tidyr) 

df2 <- df %>% 
    group_by(Metric, System) %>% 
    mutate(GM = gm_mean(Value)) %>% 
    ungroup() %>% 
    spread(Benchmark, Value) %>% 
    gather(x, y, -Metric, -System) 

> df2 
# A tibble: 12 x 4 
    Metric System   x  y 
    <chr> <chr>  <chr> <dbl> 
1 Metric1 System1   GM 154.9193 
2 Metric1 System2   GM 122.4745 
3 Metric2 System1   GM 173.2051 
4 Metric2 System2   GM 189.7367 
5 Metric1 System1 Benchmark1 120.0000 
6 Metric1 System2 Benchmark1 100.0000 
7 Metric2 System1 Benchmark1 200.0000 
8 Metric2 System2 Benchmark1 200.0000 
9 Metric1 System1 Benchmark2 200.0000 
10 Metric1 System2 Benchmark2 150.0000 
11 Metric2 System1 Benchmark2 150.0000 
12 Metric2 System2 Benchmark2 180.0000 

Funktion für mittlere geometrische Berechnung wurde von der akzeptierten Antwort auf this question genommen.

Plot (facettiert sowohl metric1 & Metric2 zugleich zeigen):

ggplot(df2, 
     aes(x = x, y = y, fill = System)) + 
    geom_col(position = "dodge") + 
    facet_grid(Metric~.) 

plot

+0

Ja! Genau das habe ich gesucht. Ich habe nicht daran gedacht, Spread + Collect noch einmal zu kombinieren, um dies zu erreichen. (also gibt es keinen Befehl, der diese Funktionalität zu einer einzigen vereint?) – mbrandalero

0
df <- left_join(df1, df2, by = "Benchmark") %>% 
    gather(Metric,Value,2:5) %>% 
    mutate(System = ifelse(grepl(".x", Metric), "System1", "System2"), 
     Metric = ifelse(grepl("1" , Metric), "Metric1", "Metric2")) 

df<-df%>%group_by(Benchmark,Metric)%>% 
      summarise(Value = mean(Value,na.rm=TRUE))%>% 
      mutate(System = "Mean")%>% 
      bind_rows(.,df) 


ggplot(df %>% filter(Metric == "Metric1"), aes(x = Benchmark, y = Value, fill = System)) + 
     geom_col(position = "dodge") 
Verwandte Themen