在数据框中指定列名会将空格改为“.”

48

假设我有一个数据框,如下所示:

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

head(df,3)

返回:

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

如何让 R 停止自动将列名中的空格替换为句点呢?例如,将 "Label 1" 替换为 "Label.1"。

4个回答

98

您可以在data.frame(以及read.table)中设置check.names = FALSE

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”这样的名称是无效的,保留字也是如此。

所有无效字符都被转换为“.”。


此外,如果您需要使用$对具有“无效”名称的变量进行子集操作,可以使用反引号`。例如:

df$`Label 1`

你的解决方案让我感到非常开心!谢谢! - Miss.Alpha

13

不需要。

如果您想要带空格的格式,则无法满足使用 df$column.1 时出现的标识符要求,因为它无法处理空格。 因此,请参阅 make.names() 函数以获取详细信息或示例:

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

11年后的编辑:答案仍然有效,即R更喜欢列名可以作为有效的变量名。但是R是灵活的:如果您坚持使用其他形式,则需要显式要求在语言内部不合法的列名:

> 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 我们可以覆盖默认的(明智的)检查方法,通过在标识符周围添加反引号,我们可以访问该列。


2
@Brandon,你可以在write.table中指定col.names。像col.names=gsub("\\."," ",colnames(df))这样的写法应该能解决问题。 - Joshua Ulrich
2
同意上面的评论。如果是为了格式化输出,那么请将空格指定为输出过程的一部分。标识符中的空格只会引发麻烦,这就是为什么它们被不鼓励或禁止的原因。 - neilfws
4
我之前很久就给这个投了反对票。但它已被证明是一个“陷阱”,已经深入到我的历史代码中(它导致了各种“其他”问题)。所以,我会将其标记为选中状态,以便路人可以从我的错误中吸取教训。 - Brandon Bertelsen
2
我知道这篇文章很老了,但是我在knitr报告的表格中需要同样的东西,虽然我明白“你不需要”,但我发现为了报告的目的,我需要一个漂亮格式化的标签。gsub 的方法对我有所帮助。我已经相应地为您下面的答案点了赞。我相信这是您问题的真正答案。 - bhive01
1
没有空格在名称中是“必须”的要求,但建议避免。您可以通过设置 check.names = F 来创建它们,并使用 df$\column.1`` 访问。这类似于 SQL 中的双引号,用于避免与关键字冲突的情况。 - Daniel Sparing
显示剩余2条评论

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

在创建数据框时自动转换列名,但在更改列名时不进行相同操作,这对我来说似乎有些不一致,但这就是目前R的工作方式。


1
names(df)<-c('Label 1','Label 2)

1
请在您的答案中添加一些描述以支持您的回答。 - Mahib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接