web-dev-qa-db-ja.com

2つの日付の間のデータフレームをサブセット化する

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を使用しています。

25
RiskTech

@MrFlickが既に指摘したように、サブセット化の基本的なロジックを回避することはできません。特定のdata.frameをサブセット化するのを簡単にする1つの方法は、例でDATE1DATE2のような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
19

_&_演算子で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 &
_
9
Dan

日付範囲を抽出する他の方法はありません。ロジックも数値の範囲を抽出するのと同じです。あなたがやったように明示的な日付変換を行うだけです。 subsetまたはwithを使用した他のサブセット化タスクと同様に、サブセット化を短くすることができます。 cutを使用して範囲を間隔に分割できます(特定のcut.Dateオーバーロード)。ただし、ベースRには日付リテラルを指定する方法がないため、変換を避けることはできません。あなたが他にどんな構文を考えていたのか想像できません。

4
MrFlick

どうですか:

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)
2
eh21

dplyrパッケージが好き
だから

>library("dplyr")

そして、あなたがしたように:

>Date1<-as.Date("2014-04-01")  
>Date2<-as.Date("2014-05-05")

最後に

>test<-filter(IBOV_RET, filter(DATE>Date1 & DATE<Date2))