2012-10-05 19 views
19

Ich weiß, es ist bevorzugt, wenn Variablennamen keine Leerzeichen enthalten. Ich habe eine Situation, in der ich Diagramme in Publikationsqualität benötige, also müssen Achsen und Legenden korrekt formatierte Beschriftungen haben, dh mit Leerzeichen. So zum Beispiel in der Entwicklung Ich könnte Variablen „Pct.On.OAC“ und Age.Group genannt, aber in meinem letzten Plot ich brauche „% auf OAC“ und „Altersgruppe“ erscheinen:Wie behandelt man Leerzeichen in Spaltennamen?

'data.frame': 22 obs. of 3 variables: 
$ % on OAC   : Factor w/ 11 levels "0","0.1-9.9",..: 1 2 3 4 5 6 7 8 9 10 ... 
$ Age Group   : Factor w/ 2 levels "Aged 80 and over",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ Number of Practices: int 47 5 33 98 287 543 516 222 67 14 ... 

Aber wenn ich versuche, diese zu zeichnen:

ggplot(dt.m, aes(x=`% on OAC`,y=`Number of Practices`, fill=`Age Group`)) + 
    geom_bar() 
) 

kein Problem damit. Aber wenn ich eine Facette hinzu:

ggplot(dt.m, aes(x=`% on OAC`,y=`Number of Practices`, fill=`Age Group`)) + 
    geom_bar() + 
    facet_grid(`Age Group`~ .) 

ich Error in [.data.frame (base, names(rows)) : undefined columns selected

Wenn ich ändern Age Group-Age.Group dann funktioniert es in Ordnung, aber wie gesagt, ich will nicht den Punkt um in der Titellegende angezeigt zu werden.

Also meine Fragen sind:

  1. Gibt es eine Abhilfe für das Problem mit der Facette?
  2. Gibt es einen besseren allgemeinen Ansatz, um das Problem von Leerzeichen (und anderen Zeichen) in Variablennamen zu behandeln, wenn ich möchte, dass der letzte Plot sie enthält? Ich nehme an, ich kann sie manuell überstülpen, aber das scheint eine Menge herumzualbern.
+0

Verwenden scale_fill (name = "Altersgruppe") oder ähnliches. – mnel

+0

@mnel entschuldigung, ich bin dir nicht gefolgt - wie löst das das problem mit dem facet_grid? Ich benutze 'scale_fill (name =" Altersgruppe ")' _insteady_? –

Antwort

14

Dies ist eine „Bug“ in dem Paket ggplot2, die aus der Tatsache, dass die Funktion as.data.frame() im internen ggplot2 Funktion quoted_df die Namen konvertiert in syntaktisch gültige Namen. Diese syntaktisch gültigen Namen können nicht im ursprünglichen Datenrahmen gefunden werden, daher der Fehler.

Zur Erinnerung:

syntaktisch gültige Namen von Buchstaben besteht, Zahlen und dem Punkt oder Unterstrichen und mit einem Buchstaben oder dem Punkt beginnen (aber der Punkt kann nicht durch eine Reihe folgen)

Es gibt einen Grund dafür.Es gibt auch ein Grund, warum ggplot Sie Etiketten labs mit festlegen können, zB die folgende Dummy-Dataset mit gültigen Namen:

X <-data.frame(
    PonOAC = rep(c('a','b','c','d'),2), 
    AgeGroup = rep(c("over 80",'under 80'),each=4), 
    NumberofPractices = rpois(8,70) 
) 

Sie Labors am Ende verwenden können, um diesen Code Arbeit zu machen

ggplot(X, aes(x=PonOAC,y=NumberofPractices, fill=AgeGroup)) + 
    geom_bar() + 
    facet_grid(AgeGroup~ .) + 
    labs(x="% on OAC", y="Number of Practices",fill = "Age Group") 

Zur Herstellung

enter image description here

+1

PS: Wie @DirkEddelbuettel darauf hinweist, verwendet afaik die Funktion 'as.data.frame' intern die Funktion' make.names() ', um diese Namen zu" korrigieren "(d. H. Gültige Bezeichner zu erzeugen). –

20

Sie fragte: „Gibt es einen besseren allgemeinen Ansatz mit dem Problem der Räume (und anderen Zeichen) für den Umgang in Variablennamen“ und ja, es gibt ein paar:

  • Nur sie nicht verwenden wie die Dinge werden, wie Sie hier erfahren haben
  • Verwenden Sie die make.names() Funktion, um sichere Namen zu erstellen; Dies wird auch von R verwendet, um Bezeichner zu erstellen (zB durch Unterstriche für Leerzeichen usw.)
  • Wenn Sie müssen, schützen Sie die unsicheren Bezeichner mit Backticks.

Beispiel für die letzten zwei Punkte:

R> myvec <- list("foo"=3.14, "some bar"=2.22) 
R> myvec$'some bar' * 2 
[1] 4.44 
R> make.names(names(myvec)) 
[1] "foo"  "some.bar" 
R> 
+0

ja, aber in diesem Fall (weil ggplot eine extra Auswertung durchführt) funktioniert das Schützen mit Backticks nicht, also sind wir wieder bei Punkt # 1 ... –

+0

Sicher, da man nicht alle anderen Pakete (einfach) ändern kann . Es gibt einen Grund, warum ich sie so eingestuft habe wie ich. Backticks ist der letzte Ausweg. –

Verwandte Themen