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

问题描述 投票:8回答:1

在控制台中,继续尝试

> 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,但由于上述问题导致某些数据集失败!

r boolean coercion
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.