web-dev-qa-db-ja.com

as.Dateがタイプ 'double'として返されるのはなぜですか?

Rでas.Date関数を操作するのに問題があります。整数の因数または文字として(方法に応じて)入ってくる.csvファイルから読み込んでいる日付のベクトルがあります。ファイルを読み込みますが、これは問題とは何の関係もないようです)、_%m/%d/%Y_としてフォーマットされています。

次のコードを使用して、ファイルを1行ずつ調べ、日付フィールドを引き出して、他の場所で使用できるように変換しようとしています。

_tmpDtm<-as.Date(as.character(tempDF$myDate), "%m/%d/%Y")
_

これにより、必要なものが得られるようです。たとえば、2014年12月30日の開始値にこれを実行すると、値_"2014-12-30"_が返されます。ただし、typeof()を使用してこの値を調べると、Rはそのデータ型が「double」であることを示しています。さらに、これを他の値にバインドし、c()またはcbind()を使用してデータフレームに格納しようとすると、データフレームに16434として格納されてしまいます。私にとっては、日付のある種の異なる内部ストレージ値が好きです。 as.Date()を使用してその値を再度変換しようとすると、Originを要求するエラーがスローされるため、これも同様であると確信しています。

それで、2つの質問:これは予想通りですか?もしそうなら、私が実際に日付型のオブジェクトになってしまうように日付を変換するより適切な方法はありますか?

ありがとうございました

7
drRussClay

次の例に示すように、日付は内部的にdoubleとして表されます。

_> typeof(as.Date("09/12/16", "%m/%d/%y"))
[1] "double"
_

のように、それはまだクラス日付としてマークされています

_> class(as.Date("09/12/16", "%m/%d/%y"))
[1] "Date"
_

ダブルなので、それを使って計算を行うことができます。しかし、それはクラスDateであるため、これらの計算はDatesにつながります。

_> as.Date("09/12/16", "%m/%d/%y") + 1
[1] "2016-09-13"
> as.Date("09/12/16", "%m/%d/%y") + 31
[1] "2016-10-13"
_

編集私はc()cbind()を要求しました。なぜなら、それらは奇妙な振る舞いに関連している可能性があるからです。次の例を参照してください。ここでは、c内で順序を切り替えると、結果のタイプではなくクラスが変更されます。

_> c(as.Date("09/12/16", "%m/%d/%y"), 1)
[1] "2016-09-12" "1970-01-02"
> c(1, as.Date("09/12/16", "%m/%d/%y"))
[1]     1 17056

> class(c(as.Date("09/12/16", "%m/%d/%y"), 1))
[1] "Date"
> class(c(1, as.Date("09/12/16", "%m/%d/%y")))
[1] "numeric"
_

編集2 -c()およびcbindは、オブジェクトを1つのタイプに強制します。最初の編集は強制の異常を示していますが、一般的に、ベクトルは1つの共有タイプでなければなりません。 cbindは、行列に強制変換し、次に単一の型に強制変換するため、この動作を共有します。

typeofおよびclassの詳細については、 このリンク を参照してください。

9
Bernhard

これは予想通りです。 typeof()を使用しました;おそらくclass()を使用する必要があります:

R> Sys.Date()
[1] "2016-09-12"
R> typeof(Sys.Date())       # this more or less gives you how it is stored
[1] "double"
R> class(Sys.Date())        # where as this gives you _behaviour_
[1] "Date"
R> 

マイナーアドバタイズメント:新しいパッケージがあります いつでも 、現在CRANで受信中です。これは、「すべて」をPOSIXct(anytime()経由)またはDate(anydate()経由)に変換するときに処理します。

例えば。:

R> anydate("12/30/2014")             # no format needed
[1] "2014-12-30"
R> anydate(as.factor("12/30/2014"))  # converts from factor too
[1] "2014-12-30"
R> 
5