8

簡単な例を次に示します。3 つの日付を含むデータ フレームがあります。

Data <- as.data.frame(as.Date(c('1970/01/01', '1970/01/02', '1970/01/03')))
names(Data) <- "date"

次に、同じエントリで構成される列を追加します。

for(i in 1:3){
  Data[i, "date2"] <- Data[i, "date"]
}

出力は次のようになります。

        date date2
1 1970-01-01     0
2 1970-01-02     1
3 1970-01-03     2

不明な理由により、列 date2 のクラスは、date のクラスであった date ではなく数値です。不思議なことに、R に明示的に Date 形式を使用するように指示すると、次のようになります。

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

違いはありません。

        date date2 date3
1 1970-01-01     0     0
2 1970-01-02     1     1
3 1970-01-03     2     2

問題は、[] のサブセット化の使用にあるようです。日付の 2 つの列があり、いくつかの要因に応じて他の 2 つの列の 1 つから日付を選択する 3 つ目の列を作成する興味深い例では、同じことが起こります。

もちろん、次のようなことを行うことで、振り返ってすべてを修正できます。

Data$date4 <- as.Date(Data$date2, origin = "1970-01-01")

しかし、私はまだ疑問に思っています:なぜですか? なぜこうなった?別の列に転送されたときに、私の日付が日付のままにならないのはなぜですか??

4

1 に答える 1

6

これは最終的な解決策ではありませんが、理解するのに役立つと思います。

ここにあなたのデータ:

Data <- data.frame(date = 
                  as.Date(c('2000/01/01', '2012/01/02', '2013/01/03')))

この 2 つの vector を取得します。1 つは既定で数値として入力され、2 つ目は Date として入力されます。

vv <- vector("numeric",3)
vv.Date <- vector("numeric",3)
class(vv.Date) <- 'Date'
vv
[1] 0 0 0
> vv.Date
[1] "1970-01-01" "1970-01-01" "1970-01-01" ## type dates is initialized by the origin 01-01-1970

ループの最初のステップで行うように、各ベクトルの最初の要素を割り当てようとすると、次のようになります。

vv[1] <- Data$date[1]
vv.Date[1] <- Data$date[1]
vv
[1] 10957     0     0
> vv.Date
[1] "2000-01-01" "1970-01-01" "1970-01-01"  

ご覧のとおり、型付きベクターは適切に作成されています。ベクトルをスカラー値で割り当てると、R は内部的にベクトルの型に変換しようとします。あなたの例に戻るには、これを行うと:

数値ベクトル (vv) を作成し、それに日付を割り当てようとします。

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

たとえば、 date3 を入力すると、次のようになります。

Data$date3 <- vv.Date

その後、もう一度やり直してください

for(i in 1:3){
  Data[i, "date3"] <- as.Date(Data[i, "date"])
}

良い結果が得られます:

       date      date3
1 2000-01-01 2000-01-01
2 2012-01-02 2012-01-02
3 2013-01-03 2013-01-03
于 2013-07-01T15:20:53.323 に答える