2016-11-29 4 views
0

Ich möchte einen gruppierten gestapelten Barplot für mehrere verschiedene Variablen, var1PA, var2PA, grafisch darstellen, indem berechnet wird, wie oft jede Var in einem Fall und einem Steuerelement vorhanden oder abwesend war.Berechne innerhalb variablem Prozentsatz für gestapelten gruppierten Barplot

df <- data.frame(SampleID = c(1, 2, 3, 4, 5, 6, 7, 8), 
     Var1 = c(0.1 , 0.5, 0.7, 0, 0, 0, 0.5, 0.2), 
     Var1PA = c("Present", "Present", "Present", "Absent", "Absent", "Absent", "Present", "Present"), 
     Var2 = c(0, 0, 0, 0, 0.1, 0.5, 0.7, 0.2), 
     Var2PA = c("Absent", "Absent", "Absent", "Absent", "Present", "Present", "Present", "Present"), 
     Disease = c("Case", "Control", "Case", "Control", "Case", "Control", "Case", "Control")) 

Ich mag für jeden Fall und jede Steuerung innerhalb jeden var Prozentsatz anwesend und abwesend berechnen und bin nicht in der Lage es mit prop Tabelle zu tun,

vars <- c('Var1PA', 'Var2PA') 
    tt <- data.frame(prop.table(as.table(sapply(df[, vars], table)), 2) * 100) 
##above line does not calculate the percentage of present absent individually for cases 
##and controls within each var 

wenn ich in der Lage bin es dann zu tun ich kann ggplot2 verwenden zu zeichnen:

ggplot(tt, aes(Disease, Freq)) + 
geom_bar(aes(fill = Var1), position = "stack", stat="identity") + facet_grid(~vars) 

Wie bekomme ich Prozent für Fälle (anwesend und abwesend) und Kontrollen (anwesend und abwesend) für jeden des vars? Vielen Dank!

Antwort

1

Dies ist eine ziemlich einfache Erweiterung der letzten Frage. In immer um die Daten zu Langformat, behandeln wir Disease wie SampleID, sonst wird der Code identisch ist:

library(ggplot2) 
library(tidyr) 
library(dplyr) 
mdf = df %>% select(SampleID, Disease, ends_with("PA")) %>% 
    gather(key = Var, value = PA, -SampleID, -Disease) %>% 
    mutate(PA = factor(PA, levels = c("Present", "Absent"))) 

Wir dann direkt auf einem Grundstück auf ggplot unter Berufung gehen die Prozentsätze zu berechnen. Dies ist identisch mit der Grafik in der vorherigen Frage, aber mit Disease auf der X-Achse und der Facettierung hinzugefügt.

ggplot(mdf, aes(Disease)) + 
    geom_bar(aes(fill = PA), position = "fill") + 
    scale_y_continuous(labels = scales::percent) + 
    facet_grid(~Var) 

Wenn Sie die Prozentsätze in den Datenrahmen wollen, können wir mit ein wenig mehr Manipulation tun, dass:

df_summ = mdf %>% group_by(Disease, Var) %>% 
    mutate(n = n()) %>% ## calculate n for Disease and Var groups 
    group_by(Disease, Var, PA) %>% 
    summarize(Percent = n()/first(n)) ## calculate the fraction P/A in each group 

Mit diesem Datenrahmen zusammengefasst, können wir die gleiche Handlung schaffen, wie oben expliziter :

ggplot(df_summ, aes(Disease, Percent)) + 
    geom_bar(aes(fill = PA), position = "stack", stat = "identity") + 
    scale_y_continuous(labels = scales::percent) + 
    facet_grid(~Var) 
+0

Hallo Gregor, danke für die Lösungen! Sehr coole Verwendung von dplyr und tidyr Funktionen. Eine kurze Frage, was bedeuten die negativen Zeichen '-SampleID -Disease'? Auch hatte ich bisher noch keine extensive Verwendung von '%>%' gesehen. Soll das vermieden werden, mehrere neue Zwischen-dfs zu benennen? –

+0

Hallo Gregor, kurze Frage, in deinem Code kann man 'ends_with (" PA ")' mit einem generischen wie einem Vektor von Strings ersetzen. Angenommen, ich biete 'vars = c (" Var1 "," Var2 "," Var3 ")' an, kann "wählen" stattdessen diesen Vektor verwenden? Ich habe mehrere Variablen, die mit PA enden und ich möchte nur einige von ihnen selektiv darstellen. Danke, Manasi –

+0

Ich fand eine Lösung in der Dokumentation mit 'one_of (vars)' Falls jemand diese Kette liest! –

0

Versuchen Sie folgendes:

ggplot(tt, aes(Var2, Freq, fill=Var1)) + geom_bar(stat='identity') + 
    xlab('Variable') + guides(fill=guide_legend("Variable")) 

enter image description here

Verwandte Themen