R中的Data.frames:名称自动完成?

R中的Data.frames:名称自动完成?,r,dataframe,R,Dataframe,对不起,如果这是琐碎的。我在R中看到以下行为: > myDF <- data.frame(Score=5, scoreScaled=1) > myDF$score ## forgot that the Score variable was capitalized [1] 1 >myDF myDF$score##忘记了score变量是大写的 [1] 1 预期结果:返回NULL(更好的是:抛出错误) 我已经搜索过了,但是找不到任何关于这种行为的讨论。是否有人能够提供这方面的任何

对不起,如果这是琐碎的。我在R中看到以下行为:

> myDF <- data.frame(Score=5, scoreScaled=1)
> myDF$score ## forgot that the Score variable was capitalized
[1] 1
>myDF myDF$score##忘记了score变量是大写的
[1] 1
预期结果:返回NULL(更好的是:抛出错误)


我已经搜索过了,但是找不到任何关于这种行为的讨论。是否有人能够提供这方面的任何参考资料,为什么这样做的理由,以及是否有任何方法可以防止这种情况?一般来说,我希望R的版本对其变量更严格一些,但似乎永远不会发生…

操作符只需要数据帧名称的第一个唯一部分就可以对其进行索引。例如:

> d <- data.frame(score=1, scotch=2)
> d$sco
NULL
> d$scor
[1] 1
>d$sco
无效的
>d$scor
[1] 1
避免此行为的一种方法是使用[[]]运算符,其行为如下:

> d <- data.frame(score=1, scotch=2)
> d[['scor']]
NULL
> d[['score']]
[1] 1
>dd['scor']]
无效的
>d[[得分]]
[1] 1
我希望这是有帮助的

干杯

使用
[,“”]
而不是
$
将在找不到名称的情况下引发错误

myDF$score
#[1] 1

myDF[,"score"]
#Error in `[.data.frame`(myDF, , "score") : undefined columns selected
myDF[,"Score"]
#[1] 5

myDF[,"score", drop=TRUE] #More explicit and will also work with tibble::as_tibble
#Error in `[.data.frame`(myDF, , "score", drop = TRUE) : 
#  undefined columns selected
myDF[,"Score", drop=TRUE]
#[1] 5

as.data.frame(myDF)[,"score"] #Will work also with tibble::as_tibble and data.table::as.data.table
#Error in `[.data.frame`(as.data.frame(myDF), , "score") : 
#  undefined columns selected
as.data.frame(myDF)[,"Score"]
#[1] 5

unlist(myDF[,"score"], use.names = FALSE) #Will work also with tibble::as_tibble and data.table::as.data.table
#Error in `[.data.frame`(myDF, , "score") : undefined columns selected
unlist(myDF[,"Score"], use.names = FALSE)
#[1] 5

切换到
[[
,默认情况下不进行部分匹配。还有一个
warnPartialMatchDollar
选项,您可以打开。这些都在
?Extract
中进行了详细讨论。非常感谢您的快速回答。请随时将此选项作为答案重新发布,以便我可以接受。将此选项添加到我的所有代码中-这确实应该是一个选项默认情况下是流血的。在之前目睹了关于这一点的争论之后,我怀疑R Core的一些成员可能会回应说,如果您使用正确的函数([]),则默认情况下会启用精确匹配部分匹配对于交互使用非常有用,因此$只应在该上下文中使用。但是,当语言的某些方面对于交互/编程使用更好/更差时,这可能会令人困惑。@joran:作为一个注释,似乎即使是大型软件包的维护人员也不总是使用[[甚至使用部分匹配。在启用warnPartialMatchDollar后,刚从lme4收到这些警告。这也意味着启用此选项几乎不可用,因为它会向控制台发送来自软件包的警告。opt$conv中的警告:“conv”与“convergence”中的部分匹配opt$conv中的警告:“conv”与“convergence”中的部分匹配opt$conv中的rgence警告:famL$fami中的'conv'与'convergence'部分匹配警告:'fami'与'family'部分匹配@RobHall我认为软件包依赖于此是一种不好的做法,因此如果遇到此类问题,我建议联系软件包维护人员,如果您确实想要
[[
要进行部分匹配,您可以进行
d[['score',exact=FALSE]
(摘自
?Extract
,h/t@joran)