これにはおそらく非常に簡単な回避策がありますが、ここで説明します... 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")