如何处理列名中的空格?

时间:2012-10-05 10:26:06

标签: r ggplot2

我知道如果变量名称中没有空格,则首选。我的情况是需要出版品质的图表,所以轴和图例需要有正确格式的标签,即带空格。因此,例如,在开发过程中,我可能会有名为“Pct.On.OAC”和Age.Group的变量,但在我的最终情节中,我需要出现“%on OAC”和“Age Group”:

'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 Group更改为Age.Group,那么它可以正常工作,但正如我所说,我不希望该点出现在标题图例中。

所以我的问题是:

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

4 个答案:

答案 0 :(得分:22)

你问“有没有更好的通用方法来处理变量名中的空格(和其他字符)的问题”,是的还有一些:

  • 只是不要使用它们,因为你在这里经历的事情将会破裂
  • 使用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> 

答案 1 :(得分:16)

这是包ggplot2中的“错误”,它来自内部ggplot2函数as.data.frame()中的函数quoted_df将名称转换为语法上有效的名称。这些语法上有效的名称在原始数据帧中找不到,因此出错。

提醒您:

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

这是有原因的。 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

答案 2 :(得分:0)

对多字列名的一种简单解决方案是用下划线字符将它们分开。与其他约定相比,它具有一些优点:

  • _列名中的下划线有效
  • 下划线将单词分开以提高可读性
  • 驼峰式阅读可能很棘手(请考虑sSwW-类似的字母会引起混淆,因为R 区分大小写的)
  • 在列名中使用句点(.)是有效的,但从可读性的角度来看通常不是理想的选择,尤其是对于R语言以外的任何人,如果他们将句点误认为是方法调用(例如{{1 }}可能是R中的列名,但如果有人习惯于阅读其他语言(如ruby或python),则看起来data.test方法正在对象.test上被调用在列名中使用空格是有效的,但是在引用这些列时,必须在列名前后加上反引号,即`符号。
    • 例如data掌骨长度`]

TL; DR 使用下划线将列名称中的单词分隔开,您应该不会有任何问题(请避免在列名称中使用空格,如果数据已经包含空格,请用完整的列名称括起来在函数中引用时带有反引号`)

答案 3 :(得分:-1)

library("data.table", lib.loc = "~/R/win-library/3.5")

names(inv01)

[1] "INV_YEAR"  "TREE_NO"   "DBH 2019"  "HT 2019" 

inv01tmp<-inv01[,list(DBH=`DBH 2019`,HT=`HT 2019`)]

enter image description here