为什么R中有1..99,999 =="1".."99,999",但100,000!="100,000"?

Rob*_*ski 8 boolean r coercion

在控制台中,继续尝试

> sum(sapply(1:99999, function(x) { x != as.character(x) }))
0
Run Code Online (Sandbox Code Playgroud)

对于通过99999的所有值1, "1" == 1,"2" == 2,...,99999 == "99999"TRUE.然而,

> 100000 == "100000"
FALSE
Run Code Online (Sandbox Code Playgroud)

为什么R有这种古怪的行为,这是一个错误吗?什么是解决方法,例如,检查原子字符向量中的每个元素是否实际上是数字的?现在我试图检查是否x == as.numeric(x)每个x,但由于上述问题导致某些数据集失败!

Jos*_*ien 14

看看as.character(100000).它的价值不等于"100000"(看看你自己),而R基本上只是告诉你.

as.character(100000)
# [1] "1e+05"
Run Code Online (Sandbox Code Playgroud)

这里,来自?ComparisonR的规则是将关系运算符应用于不同类型的值:

如果两个参数是不同类型的原子向量,则一个被强制为另一个的类型,优先级(递减)顺序为字符,复数,数字,整数,逻辑和原始.

这些规则意味着当您测试1=="1"R 是否首先将LHS上的数值转换为字符串,然后测试LHS和RHS上字符串的相等性时.在某些情况下,这些将是平等的,但在其他情况下,他们不会.什么情况下产生的不平等将取决于当前设置options("scipen")options("digits")

因此,当您键入时100000=="100000",就好像您实际执行了以下测试.(注意,在内部,R可能/可能确实使用as.character()与执行转换不同的东西):

as.character(100000)=="100000"
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

  • @SeñorO在`x == y`中,如果`y`是字符,那么`x`被转换,所以它就好像*`as.character(100000)=="100000"`被调用.二元运算符的哪一侧无关紧要; 只要其中一个是角色,另一个将被强制转换为角色,如果不是这样的话. (2认同)