字符比较如何在R中起作用?

时间:2013-11-07 10:43:09

标签: r posixct

我曾经在我的代码中直接使用字符串比较而没有考虑太多。然后我最近发现有些东西在这里,好像它起作用了

> "1" < "2"
[1] TRUE

失败了
> "6" < "10"
[1] FALSE

我认为对此有一个非常简单的解释,我只是愚蠢。也许它会比较他们的ASCII值或其他东西。任何见解?

我问的原因是我正在计划对具有类别字符的时间戳的矢量进行排序。

示例:

> timeStamps <- c("2013/10/30 12:12:17","2013/10/30 12:12:38","2013/10/30 12:10:32","2013/10/30 12:09:42")
> sort(timeStamps)
[1] "2013/10/30 12:09:42" "2013/10/30 12:10:32" "2013/10/30 12:12:17" "2013/10/30 12:12:38"

这样做是否安全?或者他们的情况会失败,我应该将其转换为适当的时间戳格式然后对其进行排序?

1 个答案:

答案 0 :(得分:3)

字符串之间的比较取决于区域设置和字符串的编码。 ?Comparison帮助页面详细介绍了该过程。

大多数(可能是所有)区域设置和编码都会考虑"0" < "1" < "2" ... " < "9",因此只要您的日期时间采用%Y/%m/%d %H:%M:%S格式,它们就会被正确排序。

这是一个非常危险的方法,因为

  1. 单个数字天或月(例如3月3而不是03)会破坏排序顺序。

  2. 连字符或其他标点符号而不是斜杠会破坏排序顺序。

  3. 您将无法识别不存在的日期时间。

  4. 总而言之,您将调整使用字符串作为日期调试问题的时间远远超过编写一行代码以转换为日期格式的时间。

    timeStamps <- strptime(timeStamps, "%Y/%m/%d %H:%M:%S")
    

    或者

    library(lubridate)
    timeStamps <- ymd_hms(timeStamps)