这是一个奇怪的问题,有一个简单的解决方法,但我很好奇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
发生了什么事?拜托,为了我自己的理智......
答案 0 :(得分:3)
“引号中的数字”根本不是数字,而是一串字符。这些字符碰巧在屏幕上显示的是与相应数字相同的图形,但它们基本上不是同一个对象。
您看到的行为与以下内容一致:
numeric
)以您应该期望的方式进行比较,数字与自然顺序进行比较。所以,-1&lt; -2确实是FALSE
。character
)按字典顺序进行比较,大致意味着它按字母顺序逐字符地比较,从左到右。由于“-1”和“-2”以相同的字符开头,我们移动到第二个,“2”在“1”之后,所以“-2”在“-1”之后,因此“-1”&lt ; “-2”是TRUE
。numeric
转换为character
,这解释了您上面得到的结果(所有不匹配的示例都给出了TRUE
)。请注意,将numeric
转换为character
更有意义,而不是相反,因为大多数character
无法自动转换为numeric
一种有意义的方式。
答案 1 :(得分:0)
我一直认为这是因为默认行为是将引号中的值视为字符,将不带引号的值视为double。如果没有明确声明数据类型,您可以得到:
> typeof(-1)
[1] "double"
> typeof("-1")
[1] "character"
> typeof(as.numeric("-1"))
[1] "double"
只有当负数放在引号中时,它才会按字母顺序排序,因为它们是字符。