在 data.frame 中指定列名会将空格更改为“。”

Posted

技术标签:

【中文标题】在 data.frame 中指定列名会将空格更改为“。”【英文标题】:Specifying column names in a data.frame changes spaces to "." 【发布时间】:2011-03-25 13:58:53 【问题描述】:

假设我有一个 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 停止自动用列名中的句点替换空格?即,“Label 1”而不是“Label.1”。

【问题讨论】:

【参考方案1】:

您可以在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`

【讨论】:

您的解决方案让我很开心!谢谢!【参考方案2】:

你没有。

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

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

11 年后编辑: 答案仍然是 R 更喜欢列名可以是有效的变量名。但是 R 是灵活的:如果您坚持可以使用另一种形式 _but 然后需要明确要求在语言内非有效的列名:

> 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,我们覆盖了默认(和明智的)检查,并通过将标识符包装在反引号中,我们可以访问该列。

【讨论】:

@Brandon,您可以在write.table 中指定col.names。像col.names=gsub("\\."," ",colnames(df)) 这样的东西应该可以解决问题。 同意上述cmets。如果它用于格式化输出,则将空格指定为输出过程的一部分。标识符中的空格只是自找麻烦,这就是不鼓励/不允许使用它们的原因。 我很久以前就反对了。但事实证明,它是在我的历史代码中起作用的“陷阱”之一(它会导致各种“其他”问题)。所以,它得到了复选标记,所以路人从我的错误中吸取教训。 我意识到这在这一点上已经很老了,但是我需要在 knitr 报告中的表格中使用相同的东西,虽然我理解“你不需要”,但我发现出于目的我需要格式良好的标签。 gsub 的东西对我有用。我在下面相应地支持了你的答案。我相信这是您问题的真正答案。 名称中不能有空格并不是“要求”,但建议这样做。您可以按照描述使用 check.names = F 创建它们,并以 df$`column.1` 访问。类似于 SQL 中用于与关键字等冲突的名称的双引号。【参考方案3】:

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

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 目前的工作方式。

【讨论】:

【参考方案4】:
names(df)<-c('Label 1','Label 2)

【讨论】:

请添加一些描述来支持您的回答。

以上是关于在 data.frame 中指定列名会将空格更改为“。”的主要内容,如果未能解决你的问题,请参考以下文章

将列表中的值更改为字典中指定的值?

为啥在列名中指定主/外键属性

在“引用”迁移中指定列名

在 Liquibase 中指定不同的“TAG”列名

如何在 SQL Server 的交叉应用联接中指定列名

如何使用变量在ggplot中指定列名