2012-10-05 102 views
19

我知道如果变量名中没有空格,它是首选。我有一种情况需要出版质量的图表,因此轴和图例需要格式正确的标签,即空格。因此,举例来说,在发展中,我可能变量称为“Pct.On.OAC”和Age.Group,但在我的最后的情节,我需要“在OAC%”和“年龄组”出现:如何处理列名中的空格?

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

但是,当我尝试绘制这些:

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

没有问题。但是,当我添加一个方面:

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

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

如果我改变Age GroupAge.Group然后正常工作,但正如我所说,我不想点出现在标题图例中。

所以我的问题是:

  1. 是否有与小的问题的变通方法?
  2. 当我想要最终情节包含它们时,是否有更好的通用方法来处理变量名称中的空格(和其他字符)问题?我想我可以手动覆盖它们,但是这看起来好像很多。
+0

使用scale_fill(name =“Age group”)或类似的。 – mnel

+0

@mnel对不起,我没有跟着你 - 这怎么解决facet_grid的问题?我使用'scale_fill(name =“Age Group”)'_instead_? –

回答

14

这是在来自一个事实,即在内部GGPLOT2功能quoted_df功能as.data.frame()名称转换为包ggplot2一个“错误”语法有效的名字。这些语法上有效的名称在原始数据框中找不到,因此出现错误。

提醒您:

语法上有效的名称由字母,数字和点或 下划线字符,以字母或点开始(但点 不能后跟一个数字)

这是有原因的。还有一个原因ggplot允许您使用与有效名称下面的虚拟数据集采用labs,如设置标签:

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

您可以使用末尾的实验室,以使此代码工作

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

生产

enter image description here

+1

PS:正如@DirkEddelbuettel所指出的,afaik函数as.data.frame在内部使用函数make.names()来“更正”这些名称(即创建有效的标识符)。 –

20

你问“有没有处理的变量名称空间(和其他字符)的问题,更好的一般方法”是的有几个:

  • 只要不使用它们因为事情会像你在这里经历的那样破坏
  • 使用make.names()函数来创建安全名称;这也被R用来创建标识符(例如通过为空格等使用下划线)
  • 如果您必须使用反引号保护不安全的标识符。

实例最后两点:

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

是的,但在这种情况下(因为ggplot做了一些额外的评估),使用反引号保护不起作用,所以我们回到你的观点#1 ... –

+0

当然,因为不能(容易地)改变所有其他包。我按照自己的方式对他们进行排名是有原因的。反引号是最后的手段。 –