R中的合法列名以及语法上无效的列名的后果

时间:2019-02-08 17:31:39

标签: 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)对其进行调整,以便   是的,并确保没有重复。

3 个答案:

答案 0 :(得分:3)

唯一的后果是您需要转义或引用名称才能使用它们。您可以使用双引号或将标准评估与[[列子设置运算符一起使用:

df[['2019-Jan']]

…或使用反引号将标识符名称转义(R令人困惑地引用此引号),并使用$子设置:

df$`2019-Jan`

两者都能工作,并且可以自由使用(只要它们不会导致代码无法完全阅读)。


为了使事情更加混乱,R允许在某些情况下使用'…'"…"代替`…`

df$'2019-Jan'

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

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


1 类型。 R parser 将其视为字符串。特别是,'"都可以使用,并且被相同地对待。但是在随后的表达式的求值中,它被视为名称。

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

答案 1 :(得分:3)

NA问题与名称无关。 read.csv期望最后一列后没有逗号输入。在最后一列之后有一个逗号,因此read.csv读取"2019-Feb",之后的空白作为第三列的列名。该列没有数据,因此分配了NA值。

删除多余的逗号,然后正确读取。当然,使用read.csv之后仅删除最后一列可能会更容易。

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

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

答案 2 :(得分:2)

考虑df$foo,其中foo是列名。语法上无效的名称将不起作用。

对于NA,结果是第一行中有三列,第二行中只有两列。