35

我知道如果变量名中没有空格,这是首选。我有一种需要出版质量图表的情况,因此轴和图例需要具有格式正确的标签,即带有空格。因此,例如,在开发中,我可能有名为“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 GroupAge.Groupthen 它可以正常工作,但正如我所说,我不希望点出现在标题图例中。

所以我的问题是:

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

4 回答 4

27

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

  • 只是不要使用它们,因为您在这里所经历的事情会破裂
  • 使用该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> 
于 2012-10-05T11:28:31.833 回答
20

这是包中的一个“错误”,ggplot2原因是as.data.frame()内部 ggplot2 函数中的函数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

于 2012-10-05T11:35:18.833 回答
1

多词列名的一个简单解决方案是简单地用下划线分隔它们。与其他约定相比,它具有一些优势:

  • _列名中的下划线有效
  • 并且下划线分隔单词以提高可读性
  • Camelcase 可能很难阅读(考虑svsSwvs W- 相似的字母可能会导致混淆,这可能是有问题的,因为 R区分大小写)
  • .在列名中data.test使用句点(如果有人习惯于阅读其他语言(如 ruby​​ 或 python),则.test在对象上调用该方法)data
  • 在列名中使用空格是有效的,但是在引用这些列时,需要用反引号将列名括起来,即 ` 符号
    • 例如iris[ , 萼片长度`]

TL;DR Use the underscore to separate words in column names and you shouldn't have any problems (avoid spaces in column names, and if you data already has some, surround the full column name with backticks ` when referring to it in functions)

于 2020-11-26T02:07:41.887 回答
-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`)]

在此处输入图像描述

于 2019-03-07T13:57:59.960 回答