2016-06-28 7 views
2

の日付(四半期)に基づいてランキングを作成します。すべての一意のIDについては私たちは、次のデータテーブルで開始しますR

id  date 
1: 1 2016-03-31 
2: 1 2015-12-31 
3: 1 2015-09-30 
4: 1 2015-06-30 
5: 1 2015-03-31 
6: 2 2016-03-31 
7: 2 2015-09-30 
8: 2 2015-06-30 
9: 2 2015-03-31 
10: 2 2014-12-31 

library(data.table) 
DT <- data.table(c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
       as.IDate(c("2016-03-31", "2015-12-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2016-03-31", "2015-09-30", "2015-06-30", 
        "2015-03-31", "2014-12-31"))) 
setnames(DT, c("id", "date")) 

を、私は、ランキングを作成したいです。私はランクの日付を取得するには、その日(私は日を考慮していない)から3ヶ月を削除する必要があり、後に特定のIDの最も現在の日付が0のランクを持つべきである-1。私はランク-19までそれを繰り返さなければならない。ランクを含む新しい列を追加した後。

最終的な出力は、(ID = 2の順位に注意してください)というようになります。

id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 

答えて

5

私は(akrunの答え@からorderを借りて)んでしょう:

DT[order(-date), rank_year := { 
    z = month(date) + year(date)*12 
    as.integer((z - z[1L])/3) 
}, by=id] 

    id  date rank_year 
1: 1 2016-03-31   0 
2: 1 2015-12-31  -1 
3: 1 2015-09-30  -2 
4: 1 2015-06-30  -3 
5: 1 2015-03-31  -4 
6: 2 2016-03-31   0 
7: 2 2015-09-30  -2 
8: 2 2015-06-30  -3 
9: 2 2015-03-31  -4 
10: 2 2014-12-31  -5 
+0

ありがとう行うことができます!私の場合は、@akrunが提案するように 'DT(order、id、-date) 'を追加する必要があります。私はあなたのソリューションが特定のIDの最初の日付に基づいてランキングを行うと思います。 – Alexis

+0

@Alexis Ok、この場合のために編集されました。 – Frank

+0

私は実際に編集を理解していません。希望の出力とともに新しい例を得ることができますか?それが元の質問から大きく離れている場合は、新しい質問として投稿することもできます。 – Frank

1

我々また

DT[order(id, -date)][, rank_year := 
      -1*c(0,cumsum(as.numeric(abs(diff(date)))))%/%90 , by = id][] 
# id  date rank_year 
#1: 1 2016-03-31   0 
#2: 1 2015-12-31  -1 
#3: 1 2015-09-30  -2 
#4: 1 2015-06-30  -3 
#5: 1 2015-03-31  -4 
#6: 2 2016-03-31   0 
#7: 2 2015-09-30  -2 
#8: 2 2015-06-30  -3 
#9: 2 2015-03-31  -4 
#10: 2 2014-12-31  -5 
関連する問題