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

时间:2013-09-23 16:42:59

标签: r boolean coercion

在控制台中,继续尝试

> sum(sapply(1:99999, function(x) { x != as.character(x) }))
0

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

> 100000 == "100000"
FALSE

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

1 个答案:

答案 0 :(得分:14)

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

as.character(100000)
# [1] "1e+05"

此处,从?Comparison开始,R是将关系运算符应用于不同类型值的规则:

  

如果两个参数是不同类型的原子矢量,则一个是    强迫对方的类型,(递减)顺序    优先级是字符,复数,数字,整数,逻辑和    原料

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

的当前设置

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

as.character(100000)=="100000"
# [1] FALSE