【问题标题】:How does character comparison work in R?字符比较如何在 R 中工作?
【发布时间】:2013-11-07 10:43:08
【问题描述】:

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

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

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

【问题讨论】:

  • 试试"06" &lt; "10",想想你不是在比较一个数字。
  • 谢谢。它说它将字符转换为 UTF-8 编码。是的,我知道我不是在比较一个数字或时间戳,而是一个字符。但是我的输入是一个字符向量,恰好是 timstamps,如果直接排序可以工作,因为数据很大,我试图避免转换为 POSIXct 格式,然后对其进行排序。

标签: r posixct


【解决方案1】:

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

大多数(可能所有)语言环境和编码都会考虑"0" &lt; "1" &lt; "2" ... " &lt; "9",因此只要您的日期时间格式为%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)

【讨论】:

  • 谢谢。转换的问题不在于代码的编写,而在于转换所花费的时间。我的数据很大,我希望尽可能避免转换。但你说服了我以正确的方式去做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2023-01-23
  • 2016-11-24
相关资源
最近更新 更多