50

DateorPOSIXctオブジェクトを反復処理すると が生じるのはなぜnumericですか? 例えば:

test = as.Date("2009-01-01")
print( class( test ) )
# [1] "Date"
for ( day in test )
{
    print( class( day ) )
}
# [1] "numeric"

同じことが起こりPOSIXctます:

test = as.POSIXct("2009-01-01")
print( class( test ) )
# [1] "POSIXct" "POSIXt"
for ( day in test )
{
    print( class( day ) )
}
# [1] "numeric"
4

6 に答える 6

37

?"for"seq( の後の部分in)は、「ベクトル(リストと式を含む)またはペアリストまたは「NULL」に評価される[A]n式」であると述べています。

オブジェクトは厳密にはベクトルではないため、Dateベクトルは強制されています。numericDate

is.vector(Sys.Date())
# [1] FALSE
is.vector(as.numeric(Sys.Date()))
# [1] TRUE

POSIXct同じことがベクトルにも当てはまります。

is.vector(Sys.time())
# [1] FALSE
is.vector(as.numeric(Sys.time()))
# [1] TRUE
于 2011-06-22T04:15:07.887 に答える
24

日をループします (文字列):

     days <- seq(from=as.Date('2011-02-01'), to=as.Date("2011-03-02"),by='days' )
     for ( i in seq_along(days) )
     {
          print(i)
           print(days[i])
      }
于 2012-07-24T01:49:21.157 に答える
19

Datefor ループを使用するときに、ベクトルに適用する適切な関数を選択していません。seq_alongループされているほぼすべての日付または要素をラップする方がよいでしょう。次に、2 つのことを行います: a) 1 から始まるインデックスを期待するように設定し、b) 長さゼロのベクトルで発生する奇妙なことから保護します。また、for ループが文字ベクトルに変換する因子と一緒に使用する方がよいと思います。

is.vectorジョシュアの答え (確かに正しくて役立つ) を参照すると、関数のラベルが少し間違っているか、誤解されているだけだと思います。より正確にはhasNoAttributesOtherThanName. ほとんどの人が「ベクトル」と考えるプロパティは、and でテストされis.atomicDateオブジェクトPOSIXctTRUEそのテストから返されます。

于 2011-08-22T04:11:30.937 に答える
6

これは古い質問ですが、私は R の初心者で、同じ問題に直面しました。私の問題は並行して処理されるため、foreachを使用して、通常の場合と比較して動作が異なることを確認しましたfor

library(foreach)

start_date = as.Date("2013-08-1")
end_date = as.Date("2013-08-13")
days = seq(start_date, end_date, by = "day")

foreach(day = days, .combine='rbind') %dopar% {
  print(class(day))
}

[1] "Date"
[1] "Date"
[1] "Date"
[1] "Date"
...

私は R のほとんどの内部のことを経験していないので、なぜforeach別の動作になるのかわかりませんが、それは私の目的のために機能し、うまくいけば他の人に役立つかもしれません.

于 2014-07-31T14:24:06.230 に答える
1

日付オブジェクトに対する数値演算は通常、日数を返します。これで、エポックからの日数を提供するように求めています。1970-01-01 から 2009-01-01 までの日数である 14245

日付から:

日付は 1970 年 1 月 1 日からの日数として表され、それ以前の日付は負の値になります。それらは、現在のグレゴリオ暦の規則に従って常に印刷されますが、その暦はずっと前には使用されていませんでした (英国とその植民地では 1752 年に採用されました)。

日付は整数であることが意図されていますが、これは内部表現では強制されません。端数日は印刷時に無視されます。平均法または加算または減算によって端数日を生成することができます (Ops.Date を参照)。

print(day)私が何を意味するかを見るために追加してみてください。

test = as.Date("2009-01-01")
print( class( test ) )
for ( day in test )
{
  print(day)
  print( class( day ) )
}
于 2011-06-22T04:02:14.477 に答える