5

多数の日付を含む CSV ファイルをインポートし、as.Date 関数を使用して日付を変換しました。ただし、mapply 関数を使用して 2 つの日付の早い方を検索すると、日付のリストまたは数値ベクトルのいずれかになります。日付を含むベクトルを取得するにはどうすればよいですか?

POP.Start.final <- mapply(min, combinedOM$Cons.Start.Date.y, 
                               combinedOM$OS.Start.Date.y, 
                                MoreArgs = list(na.rm=T),SIMPLIFY=T)

これは数値ベクトルを返し、SIMPLIFY=F に変更すると日付のリストが返されますが、日付のベクトルが必要です。

4

2 に答える 2

8

この特定のケースでpminは、トリックを行うと思います:

POP.Start.final <- pmin(combinedOM$Cons.Start.Date.y,
  combinedOM$OS.Start.Date.y,
  na.rm=TRUE)

一般的な場合SIMPLIFY=TRUE(デフォルト) は、ユーティリティ関数simplify2arrayを使用して、 を介してリストをアトミック モードのベクトルに変換しますas.vector。日付は内部的に数値として格納されるためSIMPLIFY=TRUE、 は日付のリストを数値モードのベクトルに変換し、クラスを削除しますDate。クラスSIMPLIFY=FALSEを保持するように設定し、 with を使用してリストをベクトルに変換できます。Datedo.callc

POP.Start.final <- do.call(c,mapply(min, combinedOM$Cons.Start.Date.y, 
                               combinedOM$OS.Start.Date.y, 
                                MoreArgs = list(na.rm=TRUE),SIMPLIFY=FALSE))

再現可能なコード:

a <- as.Date(c("2012-01-11","2012-06-30","2012-04-18"))
b <- as.Date(c("2013-04-21","2012-03-22","2012-05-01"))
pmin(a,b)
#[1] "2012-01-11" "2012-03-22" "2012-04-18"
do.call(c,mapply(min,a,b,MoreArgs=list(na.rm=TRUE),SIMPLIFY=FALSE))
#[1] "2012-01-11" "2012-03-22" "2012-04-18"

余談ですが、Tand Ffor TRUEandを使用すると、 and は再割り当てできますが、再割り当てできないため、FALSE少し心配です。TFTRUEFALSE

于 2013-01-21T23:54:59.357 に答える
1

これが最善の方法かどうかはわかりませんがoriginas.Date関数の はJanuary 1, 1970または1970-01-01デフォルトの日付形式です。

したがって(作成したデータをあなたのものに置き換えて)、これは機能します:

> one <- as.Date("2012-01-01")
> two <- as.Date("2012-03-13")
> 
> POP.Start.final <- as.Date(
                             mapply(min,
                                    one,
                                    two,
                                    MoreArgs=list(na.rm=T)
                                   ),
                                    origin="1970-01-01"
                            )
> str(POP.Start.final)
 Date[1:1], format: "2012-01-01"
于 2013-01-21T23:49:27.403 に答える