在data.frame中指定列名称会将空格更改为"."

Bra*_*sen 31 r names illegal-characters dataframe

假设我有一个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))
Run Code Online (Sandbox Code Playgroud)

头(DF,3)

收益:

  Label.1    Label.2
1       1  1.9825458
2       2 -0.4515584
3       3  0.6397516
Run Code Online (Sandbox Code Playgroud)

如何让R停止使用列名称中的句点自动替换空格?即,"标签1"而不是"Label.1".

Bra*_*sen 64

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

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

收益:

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811
Run Code Online (Sandbox Code Playgroud)

来自?data.frame:

check.names
逻辑.如果TRUE那么检查数据框中变量的名称,以确保它们在语法上是有效的变量名,并且不会重复.如果有必要,他们会调整(按make.names)它们.


来自?make.names:

语法上有效的名称由字母,数字和点或下划线字符组成,并以字母或点开头,后面没有数字.诸如".2way"之类的名称无效,保留字也不是.

所有无效字符都被翻译为" ."


此外,如果您需要使用"无效"名称对变量进行子集化,则$可以使用反引号`.例如:

df$`Label 1`
Run Code Online (Sandbox Code Playgroud)


Dir*_*tel 8

你没有.

使用您想要的空间格式将无法满足您使用时出现的标识符的要求df$column.1- 这无法应对空间.所以请参阅make.names()函数以获取详细信息或示例:

> make.names(c("Foo Bar", "tic tac"))
[1] "Foo.Bar" "tic.tac"  
>                                              
Run Code Online (Sandbox Code Playgroud)

  • 我很久以前就投票了.但它被证明是其中一个"陷阱",它已经成为我的历史代码(它会导致各种"其他"问题).因此,它得到了复选标记以便路人从我的错误中吸取教训. (4认同)
  • @Brandon,您可以在 `write.table` 中指定 `col.names`。像 `col.names=gsub("\\."," ",colnames(df))` 这样的东西应该可以解决问题。 (2认同)
  • 同意上述评论.如果是格式化输出,则将空间指定为输出过程的一部分.标识符中的空格只是在寻找麻烦,这就是为什么不鼓励/禁止它们. (2认同)
  • 我意识到这一点已经很老了,但是我需要针对knitr报告中的表格做同样的事情,虽然我理解"你没有",但我发现为了报告的目的,我需要很好的格式化标签.gsub对我有用.我相应地在下面提出你的答案.我相信这是你问题的真正答案. (2认同)

Aar*_*ham 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)
Run Code Online (Sandbox Code Playgroud)

回报

  Label 1    Label 2
1       1  0.2013347
2       2  1.8823111
3       3 -0.5233811
Run Code Online (Sandbox Code Playgroud)

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

df$"Label 2"[1:3]
Run Code Online (Sandbox Code Playgroud)

回报

[1]  0.2013347  1.8823111 -0.5233811
Run Code Online (Sandbox Code Playgroud)

在创建data.frame时自动转换列名似乎相当不一致,但在列名更改期间不要执行相同的操作,但这就是R当前如何工作.