2012-10-05 19 views
19

Wiem, że jest preferowane, jeśli nazwy zmiennych nie zawierają spacji. Mam sytuację, w której potrzebuję wykresów jakości publikacji, więc osie i legendy muszą mieć odpowiednio sformatowane etykiety, np. Ze spacjami. Tak więc, na przykład, w rozwoju mógłbym zmienne nazywane „Pct.On.OAC” i Age.Group, ale w moim ostatnim działce muszę „% na OAC” i „grupa wiekowa” pojawiać:Jak radzić sobie ze spacjami w nazwach kolumn?

'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 ... 

Ale kiedy próbuję wykreślić te:

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

nie ma problemu z tym. Ale kiedy dodać aspekt: ​​

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

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

Jeśli zmienię Age Group do Age.Group to działa dobrze, ale jak już mówiłem, nie chcę kropkę pojawiać się w tytułowej legendzie.

Więc moje pytania to:

  1. Czy istnieje obejście problemu z aspektu?
  2. Czy istnieje lepsze ogólne podejście do rozwiązywania problemu spacji (i innych znaków) w nazwach zmiennych, gdy chcę, aby ostateczny wątek obejmował je? Przypuszczam, że mogę je ręcznie pokonać, ale wygląda na to, że dużo się dzieje.
+0

Używaj scale_fill (name = "grupa wiekowa") lub podobny. – mnel

+0

@miel przepraszam, nie podążyłem za tobą - jak to rozwiązuje problem z facet_grid? Używam 'scale_fill (name =" Age Group ")' _instead_? –

Odpowiedz

14

Jest to „błąd” w pakiecie ggplot2 że pochodzi z faktu, że funkcja as.data.frame() w wewnętrznej funkcji ggplot2 quoted_df zamienia nazwy na składniowo prawidłowe nazwiska. Takich poprawnych składniowo nazw nie można znaleźć w oryginalnej ramce danych, stąd błąd.

Dla przypomnienia:

składniowo poprawne nazwy składa się z liter, cyfr i kropki lub znaków podkreślenie i zaczynać się od litery lub kropki (ale kropce nie mogą być stosowane przez wielu)

Jest ku temu powód.Jest też powód ggplot pozwala ustawić etykiety używając labs, np stosując następujący atrapę zestawu danych z poprawnymi nazwami:

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

Można użyć laboratoria w końcu do tej pracy Kod

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

aby produkować

enter image description here

+1

PS: Jak @DirkEddelbuettel zwraca uwagę, afaik funkcja 'as.data.frame' używa funkcji' make.names() 'wewnętrznie do" poprawiania "tych nazw (tj. Tworzenia poprawnych identyfikatorów). –

20

Pytałeś „Czy istnieje lepsze ogólne podejście do radzenia sobie z problemem przestrzeni (i innych znaków) w nazwach zmiennych” i tak jest kilka:

  • Tylko nie z nich korzystać jak rzeczy się popsują, tak jak tutaj doświadczyłeś
  • Użyj funkcji make.names() do tworzenia bezpiecznych nazw; jest również używany przez R do tworzenia identyfikatorów (np. za pomocą podkreśleń dla spacji itp.)
  • Jeśli musisz, zabezpiecz niebezpieczne identyfikatory za pomocą odsunięć.

przykład przez ostatnie dwa punkty:

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

tak, ale w tym przypadku (ponieważ ggplot robi dodatkową ocenę), ochrona z backtiksem nie działa, więc wróciliśmy do twojego punktu nr 1 ... –

+0

Oczywiście, ponieważ nie można (łatwo) zmienić wszystkich innych pakietów . Jest powód, dla którego umieściłem je tak, jak zrobiłem. Backticks jest ostatnią deską ratunku. –

Powiązane problemy