1993年以来、ブラジルインデックス(IBOV)からの毎日のリターンを扱っています。2つの日付の間の期間のサブセット化の最良の方法を見つけようとしています。
データフレーム(IBOV_RET
) 以下のとおりであります :
head(IBOV_RET)
DATE 1D_RETURN
1 1993-04-28 -0.008163265
2 1993-04-29 -0.024691358
3 1993-04-30 0.016877637
4 1993-05-03 0.000000000
5 1993-05-04 0.033195021
6 1993-05-05 -0.012048193
...
2つの変数を設定しますDATE1
およびDATE2
日付として
DATE1 <- as.Date("2014-04-01")
DATE2 <- as.Date("2014-05-05")
このコードを使用して新しいサブセットを作成できました。
TEST <- IBOV_RET[IBOV_RET$DATE >= DATE1 & IBOV_RET$DATE <= DATE2,]
それはうまくいきましたが、2つの日付の間にデータをサブセット化するより良い方法があるかどうか疑問に思っていました。おそらくsubset
を使用しています。
@MrFlickが既に指摘したように、サブセット化の基本的なロジックを回避することはできません。特定のdata.frameをサブセット化するのを簡単にする1つの方法は、例でDATE1
とDATE2
のような2つの入力を受け取り、それらのサブセットパラメーターに従ってIBOV_RET
のサブセットを返す関数を定義することです。
myfunc <- function(x,y){IBOV_RET[IBOV_RET$DATE >= x & IBOV_RET$DATE <= y,]}
DATE1 <- as.Date("1993-04-29")
DATE2 <- as.Date("1993-05-04")
Test <- myfunc(DATE1,DATE2)
#> Test
# DATE X1D_RETURN
#2 1993-04-29 -0.02469136
#3 1993-04-30 0.01687764
#4 1993-05-03 0.00000000
#5 1993-05-04 0.03319502
特定の日付をmyfunc
に直接入力することもできます。
myfunc(as.Date("1993-04-29"),as.Date("1993-05-04")) #will produce the same result
_&
_演算子でsubset()
関数を使用できます。
_subset(IBOV_RET, DATE1> XXXX-XX-XX & DATE2 < XXXX-XX-XX)
_
より「整頓志向」のアプローチのための更新:
_IBOV_RET %>%
filter(DATE1 > XXXX-XX-XX, DATE2 < XXXX-XX-XX) #comma same as &
_
日付範囲を抽出する他の方法はありません。ロジックも数値の範囲を抽出するのと同じです。あなたがやったように明示的な日付変換を行うだけです。 subset
またはwith
を使用した他のサブセット化タスクと同様に、サブセット化を短くすることができます。 cut
を使用して範囲を間隔に分割できます(特定のcut.Date
オーバーロード)。ただし、ベースRには日付リテラルを指定する方法がないため、変換を避けることはできません。あなたが他にどんな構文を考えていたのか想像できません。
どうですか:
DATE1 <- as.Date("1993-04-29")
DATE2 <- as.Date("1993-05-04")
# creating a data range with the start and end date:
dates <- seq(DATE1, DATE2, by="days")
IBOV_RET <- subset(IBOV_RET, DATE %in% dates)
dplyr
パッケージが好き
だから
>library("dplyr")
そして、あなたがしたように:
>Date1<-as.Date("2014-04-01")
>Date2<-as.Date("2014-05-05")
最後に
>test<-filter(IBOV_RET, filter(DATE>Date1 & DATE<Date2))