根据另一列的排名计算列的总和

时间:2013-05-23 21:28:10

标签: r

我有一个数据集:

Security      %market value      return    Quintile*
1             0.07               100        3
2             0.10               88         2
3             0.08               78         1
4             0.12               59         1
5             0.20               106        4
6             0.04               94         3
7             0.05               111        5
8             0.10               83         2
9             0.06               97         3
10            0.03               90         3
11            0.15               119        5

实际数据集超过5,000行,我想使用R创建5个五分位数,每个五分位数假设具有20%的市场价值。此外,它们必须按回报的数量级排列。也就是说,第一个五分位数应包含具有最低回报值的20%证券,第五个五分位数应包含具有最高回报值的20%证券。我想创建“Quintile”栏目,在不同的五分位数中,可以有不同数量的证券,但总市场价值应该相同。 我尝试了几种方法,我对R很新,所以请给我一些帮助。非常感谢你提前!

塞缪尔

2 个答案:

答案 0 :(得分:1)

您可以订购数据然后使用findInterval(添加一个小的delta来使用封闭的右侧括号):

raw_data <- raw_data[order(raw_data$return),]
raw_data$Q2 <- findInterval( cumsum(raw_data$marketvalue) , seq(0,1,length=5)+0.000001 , right = T )
raw_data
#   Security marketvalue return Quintile Q2
#4         4        0.12     59        1  1
#3         3        0.08     78        1  1
#8         8        0.10     83        2  2
#2         2        0.10     88        2  2
#10       10        0.03     90        3  3
#6         6        0.04     94        3  3
#9         9        0.06     97        3  3
#1         1        0.07    100        3  3
#5         5        0.20    106        4  4
#7         7        0.05    111        5  5
#11       11        0.15    119        5  5

答案 1 :(得分:1)

以下内容适用于您的数据。

首先,按增加return排序:

dat <- dat[order(dat$return), ]

然后,计算累积的market份额并减少0.2:

dat$Quintile <- ceiling(cumsum(dat$market) / 0.2)

最后,按Security排序:

dat <- dat[order(dat$Security), ]