8

在控制台中,继续尝试

> 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)为 each x,但由于上述问题,在某些数据集上失败了!

4

1 回答 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
于 2013-09-23T16:47:26.280 回答