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"ため、日付と時刻が の形式%Y/%m/%d %H:%M:%Sである限り、正しくソートされます。

ただし、これは非常に危険なアプローチです。

  1. 1 桁の日または月 (たとえば、3 月の 03 ではなく 3) は、並べ替え順序を崩します。

  2. スラッシュの代わりにハイフンやその他の句読点を使用すると、並べ替え順序が乱れます。

  3. 存在しない日時を特定することはできません。

全体として、文字列を日付として使用することによる問題のデバッグに費やす時間は、日付形式に変換する 1 行のコードを記述する時間よりもはるかに多くなります。

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

または

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