首页 > 解决方案 > R 中的合法列名和语法无效列名的后果

问题描述

df <- read.csv(
  text = '"2019-Jan","2019-Feb",
  "3","1"', 
  check.names = FALSE
  )

好的,所以我使用check.names = FALSE并且现在我的列名在语法上无效。实际后果是什么?

df
#>   2019-Jan 2019-Feb   
#> 1        3        1 NA

为什么这会NA出现在我的数据框中?我没有把它放在我的代码中。还是我?

这是check.names供参考的手册页:

check.names 合乎逻辑。如果为 TRUE,则检查数据框中的变量名称以确保它们是语法上有效的变量名称。如有必要,它们会被调整(通过 make.names),以确保它们没有重复。

标签: r

解决方案


唯一的后果是您需要转义或引用名称才能使用它们。您可以使用字符串引用并使用带有[[列子集运算符的标准评估:

df[['2019-Jan']]

... 或者您使用反引号转义标识符名称(R 混淆地称为此引用),并使用$子集:

df$`2019-Jan`

两者都可以工作,并且可以自由使用(只要它们不会导致非常不可读的代码)。


为了使事情更加混乱,R 允许在某些情况下使用'…'and"…"而不是:`…`

df$'2019-Jan'

这里,'2019-Jan'就R 而言,不是一个字符串!这是一个转义的标识符名称。1

最后一个是一个非常糟糕的主意,因为它将名称2与根本不同的字符串混淆了。R 文档建议不要这样做。就我个人而言,我会更进一步:写作'foo'而不是`foo`引用名称应该成为未来版本的 R 中的语法错误。


1种。R解析器将其视为字符串。特别是,两者'"可以使用,并且被同等对待。但是在表达式的后续计算过程中,它被视为一个名称。

2 R 中的“名称”或“符号”是指代码中表示变量或函数参数的标识符。因此,名称可以是 (a) 函数名称,(b) 非函数变量名称,(c) 函数声明中的参数名称,或 (d) 函数调用中的参数名称。


推荐阅读