Rスクリプトには次の要件があります(Spotfireで式関数を作成するため)。
dateString <- "04/30/2015 03/21/2015 06/28/2015 12/19/2015"
startDate <- "04/01/2015"
endDate <- "07/01/2015"
注:dateStringには、任意の数の日付を含めることができます。
dateStringのすべての日付がstartDateとendDateの間にある場合は、「Yes」/ TRUEを返す必要があります。それ以外の場合は、「No」/ FALSEを返します。
'Date'クラスに変換した後between
、どちらからでも便利な関数を使用できますdplyr/data.table
。'dateString'は単一の文字列であり、を使用して、strsplit
またはを使用するだけで、空白部分で分割できscan
ます。
library(lubridate)
library(data.table)
between(mdy(scan(text=dateString, what='', quiet=TRUE)),
mdy(startDate), mdy(endDate))
上記の1行は、理解しやすいようにさまざまなステップに分割できます。
#split the string to substring at whitespace.
v1 <- scan(text=dateString, what='', quiet=TRUE)
#convert to Date class
v2 <- mdy(v1)
#use between to get a logical index of the dates
#that are between 'startDate' and 'endDate'
res <- between(v2, mdy(startDate), mdy(endDate))
res
#[1] TRUE FALSE TRUE FALSE
完全を期すために、「TRUE / FALSE」の代わりに「Yes / No」の値が必要な場合は、を使用できますifelse
。そのifelse
部分は理解しやすいでしょう。要素が「TRUE」の場合は「Yes」に置き換えられ、そうでない場合は「No」に置き換えられます。
ifelse(res, 'Yes', 'No')
#[1] "Yes" "No" "Yes" "No"
または、「res」の値を置き換えるための数値インデックス。
c('No', 'Yes')[res+1L]
#[1] "Yes" "No" "Yes" "No"
上記の手順は少し混乱するかもしれません。しかし、わかりにくいものを見つけたときはいつでも、コードを可能な限り小さいコードに分割します。ここで、私は探します
res+1L
#[1] 2 1 2 1
論理インデックスを追加/乗算すると、論理インデックスが2進整数(0/1)に強制されます。ここでは1L
、整数1を追加しました。1に強制変換されたTRUE値は2を取得するために1Lで追加され、0に強制変換されたFALSEは1とで追加され0+1 = 1
ます。
論理インデックスは数値インデックスに変換されるため、これを使用して文字列のベクトルを置き換えますc('No', 'Yes')
。文字列の最初の位置は「いいえ」であり、2番目の位置は「はい」であることに注意してください。数値インデックスの長さ、つまり「4」とそのインデックスで指定された位置インデックスに基づいて、インデックスを「はい/いいえ」に置き換えます。
外部パッケージを使用せずにこれを行うこともできます。
v2 <- as.Date(v1, '%m/%d/%Y')
v2 >= as.Date(startDate, '%m/%d/%Y') & v2 <= as.Date(endDate, '%m/%d/%Y')
#[1] TRUE FALSE TRUE FALSE
私たちは「たstartDate」と「endDateに」を検討する必要がない場合は、交換する>=/<=
と>/<
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加