2017-05-11 5 views
0

ご覧のとおり、月の最初の日が複数回繰り返される()次のようなデータがあるとします。 date変数)。月の初めの日をRで繰り返しても保持する

date  exdate strike_price  delta 
1: 1996-01-04 1997-06-21  500000 -0.094917 
2: 1996-01-04 1996-03-16  600000 0.768930 
3: 1996-01-04 1996-02-17  605000 -0.286091 
4: 1996-01-04 1996-12-21  600000 0.651049 
5: 1996-01-04 1996-03-16  540000 -0.040929 
6: 1996-01-04 1996-02-17  630000 -0.638877 
7: 1996-01-05 1996-02-17  440000 0.579155 
..... 
51: 1996-02-04 1997-06-21  500000 -0.094917 
52: 1996-02-04 1996-03-16  600000 0.768930 
53: 1996-02-04 1996-02-17  605000 -0.286091 
54: 1996-02-04 1996-12-21  600000 0.651049 
55: 1996-02-04 1996-03-16  540000 -0.040929 
56: 1996-02-04 1996-02-17  630000 -0.638877 
  1. 私は何をしようとすると、date変数に基づいて、セットに1:6からすべての観測、すなわち、観測値のALL最初の日を保つために、各月の、あります。簡単に言えば;毎月の初日が2回以上出席しており、その月の残りの日を無視して、すべてを保持したいと考えています。
  2. ステップ1で行った変更の後で、最初の2つが最も古いものをexpdateに基づいて残りの観測値から選択できますか?

日付形式はYYYY-mm-ddです。

これまでのところ、私はその日のすべてではなく、月の最初の日の1つだけを管理しています。私が使用しているコードはこれですが、希望の結果を返しません:

setDT(df)[order(date), .(delta[which.min(date)], date[which.min(date)]), by = .(year(date), month(date))] 

ありがとう。

+0

は、クラスの日のあなたの日付変数ですか? 'str(dt)'を使って、 'dt [、date:= as.Date(date)]'をチェックして、あなたの例のフォーマットで条件付きを条件付きに変換することができます。これが問題でない場合は、データセットの例(dput(head(dt、20))に記載されている問題を再現できるデータセットを作成し、その問題が繰り返されることを確認する必要があります。私が提供した答えは、サンプルデータで適切に機能します。 – lmo

+0

すべてが 'as.Date'です。私は数百の異なる日付を持っているので、 'rank(exdate)<3'による順序は、日付の「グループ」ではなく、datesetのすべてのexdatesのランクを考慮します。 –

+0

また、これは 'by =引数 'がなければ真です。 'dtNew [、.I [rank(exdate)<3]、by = date]'、 'rank(exdate)'は各日付のランクを別々に計算します。 – lmo

答えて

1

あり、より効率的な答えがありそうですが、これは動作します:

# if data table is not loaded 
library(data.table) 
# if dt is a data.frame 
setDT(dt) 

は、その後、次のコードは、あなたが望むものを生成します。

dt[dt[, .(date=min(date)), by=.(month(date), year(date))][,.(date)], on="date"] 

アイデアは、各月の日付の最小値を含む単一の列でdata.tableへ元data.tableに参加得ることです。 data.tableのi引数は連鎖されたdata.tableであり、連鎖の最初のリンクは月と年で最小の日付を持つ3列のdata.tableを返し、連鎖の2番目のリンクは月と年の変数を日付変数のみを返します。このdata.tableは、on="date"引数を使用して元のdata.tableに結合されます。

これは(日付別)第二段階、残りの中で最も低い2つのexdatesため

  date  exdate strike_price  delta 
1: 1996-01-04 1997-06-21  500000 -0.094917 
2: 1996-01-04 1996-03-16  600000 0.768930 
3: 1996-01-04 1996-02-17  605000 -0.286091 
4: 1996-01-04 1996-12-21  600000 0.651049 
5: 1996-01-04 1996-03-16  540000 -0.040929 
6: 1996-01-04 1996-02-17  630000 -0.638877 
7: 1996-02-04 1997-06-21  500000 -0.094917 
8: 1996-02-04 1996-03-16  600000 0.768930 
9: 1996-02-04 1996-02-17  605000 -0.286091 
10: 1996-02-04 1996-12-21  600000 0.651049 
11: 1996-02-04 1996-03-16  540000 -0.040929 
12: 1996-02-04 1996-02-17  630000 -0.638877 

を返し、次の2つのラインでこれを行うことができます。

# save above data.table 
dtNew <- dt[dt[, .(date=min(date)), by=.(month(date), year(date))][,.(date)], on="date"] 
# merge on the rows of the data.table that have the two lowest exdates 
dtNew[dtNew[, .I[rank(exdate) < 3], by=date]$V1,] 

.Iは、元data.table(dtNew)の行番号を返すために使用され、順位を計算ランキングに使用されます。

データ

dt <- 
structure(list(date = structure(c(9499, 9499, 9499, 9499, 9499, 
9499, 9500, 9530, 9530, 9530, 9530, 9530, 9530), class = "Date"), 
    exdate = c("1997-06-21", "1996-03-16", "1996-02-17", "1996-12-21", 
    "1996-03-16", "1996-02-17", "1996-02-17", "1997-06-21", "1996-03-16", 
    "1996-02-17", "1996-12-21", "1996-03-16", "1996-02-17"), 
    strike_price = c(500000L, 600000L, 605000L, 600000L, 540000L, 
    630000L, 440000L, 500000L, 600000L, 605000L, 600000L, 540000L, 
    630000L), delta = c(-0.094917, 0.76893, -0.286091, 0.651049, 
    -0.040929, -0.638877, 0.579155, -0.094917, 0.76893, -0.286091, 
    0.651049, -0.040929, -0.638877)), .Names = c("date", "exdate", 
"strike_price", "delta"), row.names = c(NA, -13L), class = c("data.table", 
"data.frame"), index = structure(integer(0), "`\`__date\``" = integer(0))) 
+0

私はそれのような何かを考えていた!ありがとうございました。 もう少し面倒な質問の第2部分を考えましたか? –

+0

最後に私に説明してください: 'on = "date"'これは未使用引数のエラーを与えるためです –

+0

それは変です;私はそれを更新しても、私は同じ未使用の引数エラーを取得します。 (date)]、on = "date"] 'newdata <-DF [DF [、日付=分(date) –

関連する問題