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)对其进行调整,以便 是的,并确保没有重复。
答案 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,结果是第一行中有三列,第二行中只有两列。