2

我过去常常在我的代码中直接使用字符串比较,而没有考虑太多。然后,我最近发现这里有些不对劲,好像它可以说

> "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"

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

4

1 回答 1

3

字符串之间的比较取决于字符串的语言环境和编码。帮助页面详细描述了该?Comparison过程。

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

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

  1. 个位数的日期或月份(例如 3 而不是 3 月的 03)将破坏排序顺序。

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

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

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

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

或者

library(lubridate)
timeStamps <- ymd_hms(timeStamps)
于 2013-11-07T10:58:17.193 回答