对不起,如果这是微不足道的。我在R中看到以下行为:
> myDF <- data.frame(Score=5, scoreScaled=1)
> myDF$score ## forgot that the Score variable was capitalized
[1] 1
预期结果:返回NULL(甚至更好:抛出错误)。
我已搜索过此内容,但无法找到有关此行为的任何讨论。是否有人能够就此提供任何参考,为什么要这样做的理由以及是否有任何方法可以防止这种情况?一般来说,我会喜欢一个版本的R,它的变量有点严格,但似乎永远不会发生...
答案 0 :(得分:5)
$
运算符只需要数据框名称的第一个唯一部分来索引它。例如:
> d <- data.frame(score=1, scotch=2)
> d$sco
NULL
> d$scor
[1] 1
避免此行为的一种方法是使用[[]]运算符,其行为如下:
> d <- data.frame(score=1, scotch=2)
> d[['scor']]
NULL
> d[['score']]
[1] 1
我希望这很有帮助。
干杯!
答案 1 :(得分:0)
如果找不到名称,使用 [,""]
而不是 $
会引发错误。
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