2016-03-21 9 views
3

Angenommen, ich habe einen Datenrahmen mit einigen fehlenden Werten:entfernen Legende Einträge und Facetten, wenn alle Daten sind NA

df <- data.frame(
    group = rep(c("A", "B", "C"), each = 3), 
    x = runif(9), 
    y = c(runif(6), NA, NA, NA) 
) 

Und ich will es plotten einer ästhetischen Mapping und/oder eine Facette:

ggplot(df, aes(x, y)) + 
    geom_point(aes(color = group)) + 
    facet_grid(.~group, drop = T) + 
    theme_bw() 

Welche die folgende Warnmeldung und Grafik erzeugt:

Warning message: 
Removed 3 rows containing missing values (geom_point). 

enter image description here

Wie Sie sehen können, gibt es in der C-Gruppe keine Beobachtungen für y, was bedeutet, dass keine Daten für die Gruppe geplottet werden können. Ggplot erstellt jedoch immer noch eine leere C-Facette und einen C-Legendeneintrag. Gibt es eine Möglichkeit, ggplot zu erkennen, dass alle Daten aus Gruppe C gelöscht werden und der entsprechende Facetten- und Legendeneintrag entfernt wird?

Eine Lösung besteht offensichtlich darin, diese Zeilen aus den zugrunde liegenden Daten zu entfernen. Allerdings hat mein nicht vereinfachter Datenrahmen Dutzende von Spalten, die als Gruppen- oder Achsenvariablen verwendet werden könnten, mit Blöcken von NA-Werten, die überall verstreut sind. Dies bedeutet, dass ich die Daten für jedes Diagramm, das ich erstellen möchte, unterschiedlich unterteilen muss. Ich hoffe auf eine einfachere Lösung.

Ich habe verwandte Fragen zu unused factors in single facets und subsets of data gesehen, aber die dort vorgestellten Lösungen scheinen aufgrund der NA-Werte nicht mit fehlenden Daten zu funktionieren.

EDIT, um zusätzliche Komplexität zu klären: die Daten an der Spitze sind vereinfacht, und schlagen eine einfache Lösung wie na.omit() vor. Allerdings sehen meine realen Daten etwas mehr wie diese (noch vereinfacht, natürlich):

df <- data.frame(
    group = rep(c("A", "B", "C"), each = 3), 
    v = c(runif(3), rep(NA, 6)), 
    w = c(NA, NA, NA, runif(6)), 
    x = runif(9), 
    y = c(runif(6), NA, NA, NA), 
    z = runif(9) 
) 

ich viele verschiedene Diagramme erstellen möchten, die die Beziehungen zwischen den verschiedenen Variablen zeigt. Also, wenn ich x gegen z grafisch darstellen möchte, würde ich alle drei Facetten und Legendeneinträge zeigen, während wenn ich w gegen y grafisch darstellen würde, würde ich nur B anzeigen. Das Ausführen von na.omit() auf diesem Datenrahmen löscht jede Zeile.

Offensichtlich konnte ich den Datenrahmen nur auf die Spalten setzen, die ich für die grafische Darstellung verwenden werde, und dann NA-Zeilen entfernen. Dazu muss ich jedoch für jeden Graphen einen neuen Datenrahmen erstellen, der langwierig und unelegant erscheint. Aus diesem Grund hoffe ich auf eine spezifischere ggplot-basierte Lösung. (Natürlich werde ich eine Antwort wie "es gibt keine ggplot Lösung, Sie müssen einen neuen Datenrahmen für jede Grafik erstellen" akzeptieren, wenn dies tatsächlich der Fall ist).

+0

Verwenden 'na.omit (df)' statt 'df' in Sie' ggplot' rufen: 'ggplot (na. Auslassen (df), aes (x, y)) + ... 'wird Ihnen das gewünschte Ergebnis geben. – Jaap

+0

@ProcrastinatusMaximus siehe oben Bearbeiten für warum Ihr Vorschlag nicht funktioniert (zumindest in der aktuellen Form). Obwohl die Frage, auf die Sie sich bezogen haben, die Grundlage für eine praktikable Lösung enthält, glaube ich nicht, dass es sich um ein Duplikat handelt, da ich nach einem deutlich anderen Verhalten frage, das möglicherweise eine alternative, einfachere Lösung bietet. – Joe

+0

Ok, ich habe wieder geöffnet und eine Lösung gepostet. HTH. – Jaap

Antwort

2

Mit dem aktualisierten Beispiel können Sie entweder na.omit oder complete.cases verwenden, um das gewünschte Ergebnis zu erhalten.Mit:

ggplot(df[complete.cases(df[,c('w','y')]),], aes(w, y)) + 
    geom_point(aes(color = group)) + 
    facet_grid(.~group, drop = TRUE) + 
    theme_bw() 

oder:

ggplot(na.omit(df[,c('group','w','y')]), aes(w, y)) + 
    geom_point(aes(color = group)) + 
    facet_grid(.~group, drop = TRUE) + 
    theme_bw() 

Sie erhalten:

enter image description here


Alte Antwort: Verwenden na.omit(df) statt df in Sie ggplot rufen:

ggplot(na.omit(df), aes(x, y)) + 
    geom_point(aes(color = group)) + 
    facet_grid(. ~ group) + 
    theme_bw() 

geben Sie das gewünschte Ergebnis:

enter image description here

+1

Ich denke immer noch, es wäre irgendwie "sauberer", wenn ggplot diese automatisch fallen lassen könnte, aber dies scheint die beste Lösung zu sein, wenn diese Option nicht vorhanden ist. Vielen Dank! – Joe

+0

@Joe Im Moment ist das die beste Lösung, soweit ich weiß, aber man weiß nie, was die Zukunft bringen könnte ... – Jaap

Verwandte Themen