2016-12-11 8 views
1

私は他の特性を持つ一連の金融会社のリターンを持っています。データのヘッダーは、次のとおりです。デリバリーのグループ分け内のランク付けR

ヘッド(companyReturnsNameScore)

PERMNO  date TICKER  PRC VOL  RET SHROUT 
1 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 
2 85814 20021231 CTAC 27.5700 97498 1.177725 11388 
3 85814 19990129 CTAC 14.7500 5658 -0.180556 6275 
4 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 
5 85814 20021129 CTAC 12.6600 15474 0.401993 ... 
    marketCap marketCapDeclile 
1 39791.81    2 
2 313967.16    6 
3 92556.25    4 
4 102779.46    4 
5 152958.12    5 

私はあなたが「marketCapDecile」変数に参照全期間にわたって時価総額の十分位ランク(1〜10)を計算することができます。私は十分位のランクを取得する簡単な方法として、「StatMeasures」パッケージに「十分位数」関数を使用しますが、私は日付によって十分位のランクを取得する機能を使用しようとすると、私は次のエラーを取得する:

by(companyReturnsNameScore,companyReturnsNameScore$date,decile(companyReturnsNameScore$marketCap)) Error in FUN(X[[i]], ...) : could not find function "FUN"

'decile'関数が存在します。なぜなら、 'by ...'演算の外でエラーなく実行できるからですが、内部に置くとエラーになります。

「marketCap」のデシールランクを 'by'関数で日付別に生成する方法を教えてください。私はdecile関数を使用したくないですが、quantileなどのツールを使用しようとするとdecile rankingを生成できないようです。

ありがとうございました。

+0

私は素晴らしい列でデータを取得しようとしましたが、何らかの理由で動作しませんでした。申し訳ありません... – fibrou

答えて

0

quantilefindIntervalの組み合わせの1つの方法です。 quantileとprobs = 1:10/10引数を付けて、各デシルで値を計算し、これらの値をカテゴリを構成するfindIntervalに与えます。あなたがしたい場合はもちろん

# set up dummy vector for example 
temp <- 1:100 
findInterval(temp, quantile(temp, probs=1:10/10), left.open=T) 
[1] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 
[30] 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 
[59] 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 
[88] 8 8 8 9 9 9 9 9 9 9 9 9 9 

、ちょうど十分位数の結果に1Lを追加する1から10まで

0

decile入力係数は長さに私はあなたのテストデータフレームを更新< 2を持っている場合、常に警告をスローします日付の倍数を持つ。私はこのシナリオのためlibrary(purrr);library(dplyr)の代わりby使用したい

PERMNO  date TICKER  PRC VOL  RET SHROUT  mc 
1: 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 39791.81 
2: 85814 20021031 CTAC 27.5700 97498 1.177725 11388 313967.16 
3: 85814 19980831 CTAC 14.7500 5658 -0.180556 6275 92556.25 
4: 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 102779.46 
5: 85814 20021031 CTAC 12.6600 15474 0.401993 6400 152958.12 

、全体のデータフレーム上で動作しますので、のby必要な機能。

df %>% split(.$date) %>% map_df(~ mutate(., date_decile = decile(mc))) 
    PERMNO  date TICKER  PRC VOL  RET SHROUT  mc date_decile 
1 85814 19980831 CTAC 6.1875 27989 -0.489691 6431 39791.81   1 
2 85814 19980831 CTAC 14.7500 5658 -0.180556 6275 92556.25   10 
3 85814 20021031 CTAC 27.5700 97498 1.177725 11388 313967.16   10 
4 85814 20021031 CTAC 9.0300 20192 -0.097000 11382 102779.46   1 
5 85814 20021031 CTAC 12.6600 15474 0.401993 6400 152958.12   5 
+0

ありがとうございました@ nathan-day。実際、デシルをエラーなく走らせる方法を考えました。 – fibrou

+0

私の問題は、今ではこれらのデシールランクをキャプチャしています。 > companyReturnsNameScore $ marketCapDecileRank <-by(companyReturnsNameScore $ marketCap、companyReturnsNameScore $ date、decile) '$ < .data.frame'( '* tmp *'、 "marketCapDecileRank"、value = list(: 置換行は1080行、データは1785812です) ------------------- ------------------ 日付/マーケットキャップ値の組み合わせごとにこれらのランクをキャプチャするにはどうすればよいですか? – fibrou

+0

元の(大きな)データフレームをペアにして、大きなデータフレームが特定の日付の各観測(行)に対して同じデシール値を持つように、デシールランクでマージすることもできます。 – Nate

関連する問題