12

これは、Date または POSIXct オブジェクトをループすると数値イテレータになることに関連しています。

> dates <- as.Date(c("2013-01-01", "2013-01-02"))
> class(dates)
[1] "Date"
> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

2 つの質問があります。

  1. Date オブジェクトのリストを反復処理するための推奨される方法は何ですか?
  2. ジョシュアの答え(上記のリンクされた質問から受け入れられた答え)がわかりません。ここで引用します:「オブジェクトは厳密にはベクトルではないため、あなたのDateベクトルは強制されています」。では、を強制する必要があるとどのように判断されるのでしょうか。numericDateDatenumeric
4

1 に答える 1

13

ここには 2 つの問題があります。Date1 つは、入力が からに強制されるかどうかnumericです。もう 1 つは、出力が に強制されるかどうかnumericです。

入力

@DWin と @JoshuaUlrich が指摘しているように、 for ループは へのDate入力を強制します。ループは を取り、s は技術的にはベクトルではありません。numericforvectorsDate

> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

一方、lapply単純化子sapplyにはそのような制限はありません。

> sapply( dates, function(day) class(day) )
[1] "Date" "Date"

出力

でも!上記の出力はclass()文字です。実際に日付オブジェクトを返そうとすると、sapplyそれはあなたが望むものではありません。

lapplyベクトルに強制しませんが、次のことをsapply行います。

> lapply( dates, identity )
[[1]]
[1] "2013-01-01"

[[2]]
[1] "2013-01-02"

> sapply( dates, identity )
[1] 15706 15707

これは、sapplyの簡略化関数が出力をベクトルに強制するためです。

概要

したがって、オブジェクトがあり、非オブジェクトDateを返したい場合は、またはを使用できます。非オブジェクトがあり、オブジェクトを返したい場合は、ループまたは. オブジェクトがあり、オブジェクトを返したい場合は、 を使用します。DatelapplysapplyDateDateforlapplyDateDatelapply

詳細を学ぶためのリソース

ベクトルをさらに深く掘り下げたい場合は、John Cook のノートから始めて、R Infernoに進み、SDAに進むことができます。

于 2013-01-25T18:03:42.337 に答える