【问题标题】:Comparing integers with characters in R [duplicate]将整数与R中的字符进行比较[重复]
【发布时间】:2019-11-27 02:38:26
【问题描述】:

似乎一个数字的as.character() 仍然是一个数字,我觉得这有悖常理。考虑这个例子:

1 > "2"
[1] FALSE
2 > "1"
[1] TRUE

即使我尝试使用as.character()paste()

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

这是为什么呢?当我将数字与字符串进行比较时,我不能让 R 返回错误吗?

【问题讨论】:

  • as.character 表示 15 位有效数字的实数和复数 expression?你的最终目标是什么?
  • @NelsonGon 这种行为在冗长的函数中造成了一些问题。我没想到数字和字符之间的比较会引发错误,但没有。
  • 这可能回答了stackoverflow.com/questions/14932015/why-true-true-is-true-in-r的问题,重要的部分是If the two arguments are atomic vectors of different types, one is coerced to the type of the other, the (decreasing) order of precedence being character, complex, numeric, integer, logical and raw.
  • 您可能想查看"2" &gt; 11。这样做的原因与paste0("A", 1)1L + 0.1 的工作原理基本相同。 R 在需要时更改类型。
  • @NelsonGon as.character 当然会创建字符。然后发生的是&gt; 将数字强制转换为character,并且这些字符根据文档说明的整理顺序进行比较。

标签: r


【解决方案1】:

?Comparison 的文档指出

如果两个参数是不同类型的原子向量,则将一个强制转换为另一个的类型,优先级(递减)顺序为字符、复数、数字、整数、逻辑和原始。

因此,在您的情况下,数字会自动强制转换为字符串,并根据相应的排序规则进行比较。

为了防止它,我知道的唯一选择是先手动比较class

【讨论】:

    【解决方案2】:

    正如 cmets 中所解释的,问题是数字 1 被强制转换为字符。 &lt; 操作仍然适用于字符。如果一个字符按字母顺序排在第一位,则该字符小于另一个字符。

    > "a" < "b"
    [1] TRUE
    > "z" < "b"
    [1] FALSE
    

    因此,在您的情况下,as.character(2) &gt; 1 被转换为 as.character(2) &gt; as.character(1),并且由于数字的“字母”顺序,TRUE 被返回。

    为了防止这种情况,您必须手动检查对象的类。

    【讨论】:

      猜你喜欢
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2016-07-08
      • 2021-08-21
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多