为什么R不能处理引号中负数之间的不等式

时间:2018-03-29 00:07:03

标签: r numeric quote inequality

这是一个奇怪的问题,有一个简单的解决方法,但我很好奇R为什么会这样做。

> "-1"<"-2"
[1] TRUE
> -1<"-2"
[1] TRUE
> "-1"< -2
[1] TRUE
> -1< -2
[1] FALSE
> as.numeric("-1")<"-2"
[1] TRUE
> "-1"<as.numeric("-2")
[1] TRUE
> as.numeric("-1")<as.numeric("-2")
[1] FALSE

发生了什么事?拜托,为了我自己的理智......

2 个答案:

答案 0 :(得分:3)

“引号中的数字”根本不是数字,而是一串字符。这些字符碰巧在屏幕上显示的是与相应数字相同的图形,但它们基本上不是同一个对象。

您看到的行为与以下内容一致:

  • 一对数字(R中的numeric)以您应该期望的方式进行比较,数字与自然顺序进行比较。所以,-1&lt; -2确实是FALSE
  • 一对字符串(R中的character)按字典顺序进行比较,大致意味着它按字母顺序逐字符地比较,从左到右。由于“-1”和“-2”以相同的字符开头,我们移动到第二个,“2”在“1”之后,所以“-2”在“-1”之后,因此“-1”&lt ; “-2”是TRUE
  • 在比较不匹配类型的对象时,您有两个基本选择:要么给出错误,要么将其中一种类型转换为另一种类型,然后再回到上述两个事实。 R采用第二条路线,并选择将numeric转换为character,这解释了您上面得到的结果(所有不匹配的示例都给出了TRUE)。

请注意,将numeric转换为character更有意义,而不是相反,因为大多数character无法自动转换为numeric一种有意义的方式。

答案 1 :(得分:0)

我一直认为这是因为默认行为是将引号中的值视为字符,将不带引号的值视为double。如果没有明确声明数据类型,您可以得到:

> typeof(-1)
[1] "double"
> typeof("-1")
[1] "character"
> typeof(as.numeric("-1"))
[1] "double"

只有当负数放在引号中时,它才会按字母顺序排序,因为它们是字符。