2012-10-05 34 views
19

Sé que es preferible si los nombres de variables no tienen espacios en ellos. Tengo una situación en la que necesito gráficos de calidad de publicación, por lo que los ejes y las leyendas deben tener etiquetas formateadas correctamente, es decir, con espacios. Así, por ejemplo, en el desarrollo de las variables que podría haber llamado "Pct.On.OAC" y Age.Group, pero en mi última trama I Need "% en la OAC" y "grupo de edad" a aparecer:¿Cómo tratar los espacios en los nombres de las columnas?

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

Pero cuando intento trazar siguientes:

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

ningún problema con eso. Pero cuando agrego una faceta:

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

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

Si cambio Age Group-Age.Group entonces funciona bien, pero como ya he dicho, no quiero que el punto para aparecer en la leyenda del título.

Así que mis preguntas son:

  1. ¿Hay una solución para el problema con la faceta?
  2. ¿Existe un mejor enfoque general para tratar el problema de los espacios (y otros caracteres) en nombres de variables cuando quiero que el diagrama final los incluya? Supongo que puedo exagerarlos manualmente, pero eso parece un montón de problemas.
+0

uso scale_fill (name = "grupo de edad") o similar. – mnel

+0

@mnel, lo siento, no te seguí, ¿cómo soluciona esto el problema con facet_grid? Yo uso 'scale_fill (name =" Age Group ")' _instead_? –

Respuesta

14

Este es un "error" en el paquete ggplot2 que viene del hecho de que la función as.data.frame() en la función ggplot2 interna quoted_df convierte los nombres a sintácticamente nombres válidos Estos nombres sintácticamente válidos no se pueden encontrar en el marco de datos original, de ahí el error.

recordarles:

nombres sintácticamente válidos consta de letras, números y el punto o caracteres de subrayado, y comenzar con una letra o el punto (pero el punto no puede ser seguido de un número)

Hay una razón para eso.También hay una razón por la ggplot le permite configurar las placas usando labs, por ejemplo, utilizando el siguiente conjunto de datos maniquí con nombres válidos:

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

Puede utilizar los laboratorios al final para hacer el código de trabajo

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

para producir

enter image description here

+1

PS: como señala @DirkEddelbuettel, afaik la función 'as.data.frame' utiliza la función' make.names() 'internamente para" corregir "esos nombres (es decir, crear identificadores válidos). –

20

Se preguntó "¿Hay un mejor enfoque general para tratar el problema de los espacios (y otros personajes) en los nombres de variables" y sí hay unos cuantos:

  • Eso sí, no se utilicen como las cosas se romperán como experimentó aquí
  • Utilice la función make.names() para crear nombres seguros; R también lo usa para crear identificadores (por ejemplo, al usar guiones bajos para espacios, etc.)
  • Si debe hacerlo, proteja los identificadores inseguros con trazos.

Ejemplo para los dos últimos puntos:

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

sí, pero en este caso (porque ggplot realiza una evaluación adicional), la protección con palos de retroceso no funciona, así que volvemos a su punto # 1 ... –

+0

Claro, ya que uno no puede (fácilmente) alterar todos los demás paquetes . Hay una razón por la que los clasifiqué de la manera en que lo hice. Backticks es el último recurso. –

Cuestiones relacionadas