40

假设我有一个 data.frame,如下所示:

x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10)
df <- data.frame("Label 1"=x,"Label 2"=rnorm(100))

头(df,3)

返回:

  Label.1    Label.2
1       1  1.9825458
2       2 -0.4515584
3       3  0.6397516

如何让 R 停止用列名中的句点自动替换空格?即,“标签 1”而不是“标签 1”。

4

4 回答 4

88

您可以check.names = FALSEdata.frame( 以及read.table) 中设置:

df <- data.frame("Label 1" = 1:3, "Label 2" = rnorm(3), check.names = FALSE)

返回:

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811

来自?data.frame

check.names
合乎逻辑。如果TRUE然后检查数据框中的变量名称,以确保它们是语法上有效的变量名称并且不重复。如有必要,它们会被调整(按make.names),这样它们就可以了。


来自?make.names

语法上有效的名称由字母、数字和点或下划线字符组成,并以字母或点开头,后跟数字。“.2way”等名称无效,保留字也无效。

所有无效字符都被翻译成“ .


此外,如果您需要使用 'invalid' 名称对变量进行子集$化,则可以使用 backticks `。例如:

df$`Label 1`
于 2010-08-05T02:43:44.637 回答
11

你没有。

对于您想要的空间,格式将无法满足您使用时播放的标识符的要求df$column.1——这无法处理空间。因此,请参阅make.names()函数以获取详细信息或示例:

> make.names(c("Foo Bar", "tic tac"))
[1] "Foo.Bar" "tic.tac"  
>                                              

十一年后编辑: 答案仍然是 R 更喜欢列名可以是有效的变量名。但是 R 是灵活的:如果您坚持可以使用其他形式 _but 然后需要明确要求 not-otherwise-valid-within-the-language 列名:

> x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10)
> df <- data.frame("Label 1"=x,"Label 2"=rnorm(100), check.names=FALSE)
> summary( df$`Label 2` )
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-2.2719 -0.7148 -0.0971 -0.0275  0.6559  2.5820 
> 

因此,通过说check.names=FALSE我们覆盖默认(和明智的)检查,并通过将标识符包装在反引号中,我们可以访问该列。

于 2010-08-05T01:55:20.810 回答
5

您可以更改现有数据框名称以包含空格,即使用您的示例

x <- c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10)
df <- data.frame("Label 1"=x,"Label 2"=rnorm(100))
colnames(df) <- c("Label 1", "Label 2")
head(df, 3)

返回

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811

并且您仍然可以使用 $ 运算符访问列,您只需要使用双引号,例如

df$"Label 2"[1:3]

返回

[1]  0.2013347  1.8823111 -0.5233811

在创建 data.frame 时自动转换列名对我来说似乎相当不一致,但在列名更改期间不会这样做,但这就是 R 目前的工作方式。

于 2010-08-05T02:24:59.133 回答
1
names(df)<-c('Label 1','Label 2)
于 2019-02-13T16:28:17.280 回答