2016-12-11 151 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 

我可以计算市值等分秩(1〜10)在整个期间,你在“marketCapDecile”可变见。我用的是“等分”功能中的“StatMeasures”包作为一种简单的方式来获得等分行列,但是当我尝试使用功能按日期来获得等分的行列,我得到以下错误:

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

函数'decile'存在,因为我可以在'by ...'操作之外没有错误地运行,但是当我把它放在里面时,我得到错误。

如何使用'by'函数按日期生成'marketCap'的十进制等级。我很乐意不使用“十分位”功能,但是当我尝试使用“分位数”或其他工具时,我似乎无法生成十分位排名......

感谢您的帮助。

+0

呃...我试图在漂亮的列中获取数据,但由于某种原因,没有工作。对不起帮派... – fibrou

回答

0

一种方法是quantilefindInterval的组合。 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.我您的测试数据帧更新有日期的倍数。

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 

我会使用library(purrr);library(dplyr)代替by对于这种情况,是因为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 $日期,等分) 错误'$ < - .data.frame'('* tmp *',“marketCapDecileRank”,value = list(: 替换为1080行,数据为1785812 ------------------- ------------------ 如何获取每个日期/市值的组合? – fibrou

+0

您可以将原始(大)数据框配对,以便它每个日期只有一行,或者您可以在十分位数中合并,以便大数据框对于特定日期的每个观察(行)具有相同的十分值。 – Nate