4

これにはおそらく非常に簡単な回避策がありますが、ここで説明します... Rの2つの日付ベクトル(元々は日付ベクトルとして入力されていません)を次のように比較しようとしています:2番目がNAで、最初の値がない場合は最初の値を返しますない; 2番目の日付が欠落していない場合は、2つの日付のうち最大のものを返します。または、両方の値が欠落している場合はNAを返します。たとえば、以下に示すデータの場合、次のようlastdateに計算します。

v1        v2         lastdate
1/2/2006  NA         1/2/2006
1/2/2006  12/2/2006  12/2/2006
NA        NA         NA

次のように、各行(これらのデータでは85K)のループを回避する式を作成しました。

lastdate <- function(lastdate1,lastdate2){
    if (is.na(lastdate1)==T & is.na(lastdate2)==T) {NA}
    else if (is.na(lastdate2)==T & !is.na(lastdate1)) {as.Date(lastdate1,format="%m/%d/%Y")}
    else {max(as.Date(lastdate2,format="%m/%d/%Y"),as.Date(lastdate1,format="%m/%d/%Y"))}
}
dfbobs$leaveobsdate <- lastdate(as.Date(dfbobs$leavedate1,format="%m/%d/%Y"),as.Date(dfbobs$leavedate2,format="%m/%d/%Y"))

最後の行は、日付の2つのベクトルを比較するように指示していますが、エラーが発生しているため、正しくありません。

Warning messages:
1: In if (is.na(lastdate1) == T & is.na(lastdate2) == T) { :
  the condition has length > 1 and only the first element will be used
2: In if (is.na(lastdate2) == T & !is.na(lastdate1)) { :
  the condition has length > 1 and only the first element will be used

これは非常にばかげていると確信しており、おそらくこれを行うためのはるかに簡単な方法がありますが、助けていただければ幸いです。

編集:提案されているように、ベクトルを処理するためにifelse関数を使用してこれを試みましたが、単一の値(たとえば、lastdate( "1/1/2006"、 "1/2 / 2006 "))、データフレームベクトルで試してみるとNAが生成されます。コードは次のとおりです。

lastdate <- function(lastdate1,lastdate2){
ifelse(is.na(lastdate1==T) & is.na(lastdate2==T), NA, 
    ifelse(is.na(lastdate2)==T & !is.na(lastdate1), as.Date(lastdate1,format="%m/%d/%Y"), 
        ifelse(!is.na(lastdate2) & !is.na(lastdate1), max(as.Date(lastdate2,format="%m/%d/%Y"),as.Date(lastdate1,format="%m/%d/%Y")),NA)))
}
dfbobs$leaveobsdate <- as.Date(lastdate(as.Date(dfbobs$leavedate1,format="%m/%d/%Y"),as.Date(dfbobs$leavedate2,format="%m/%d/%Y")),origin="1970-01-01")
4

2 に答える 2

1

ifベクトル化されていません-単一の引数が必要です。を使用しifelseます。

mapplyまたは、既存の関数で使用することもできます。

mapply(lastdate, as.Date(df$leavedate1, ...), as.Date(df$v2, ...))
于 2013-01-30T01:31:52.610 に答える
1

これを試して:

日付を次のように数値形式に変換します

v1<-as.character(v1); v2<-as.character(v2);
v1<-as.numeric(strftime(strptime(v1,"%m/%d/%Y"),"%Y%m%d"));
v2<-as.numeric(strftime(strptime(v2,"%m/%d/%Y"),"%Y%m%d"));

今すぐ結果を計算する

result<-ifelse(!is.na(v1) | !is.na(v2),max(v1,v2,na.rm=TRUE),NA);

選択したフォーマットにキャストバック

result<-strptime(result,"%Y%m%d");
result<-strftime(result,"%m/%d/%Y");
于 2013-01-30T03:37:29.657 に答える