2016-08-25 56 views
4

我有一个包含2列ID和收入的数据。我想创建一个列,将数据划分为10个组,每个组占总收入的10%。分位数方法为我提供了10组具有相同数量的ID而非收入的组。将行拆分为10个组,每个组的总数相同

idrev[ , decile := cut(Revenue, 
        breaks = quantile(Revenue, probs = seq(0, 1, by = 1/10)), 
        labels = 1:10, right = FALSE)] 

我获得以下类型的结果

N Revenue %Revenue 
100 $3,992 80% 
100 $518 10% 
100 $236 5% 
100 $126 3% 
100 $68 1% 
100 $35 1% 
100 $16 0% 
100 $6 0% 
100 $2 0% 
100 $1 0% 
1,000 $5,000 100% 

,而我找这个结果

N Revenue %Revenue 
798 500 10% 
104 500 10% 
47  500 10% 
25  500 10% 
14  500 10% 
7 500 10% 
3 500 10% 
2 500 10% 
1 500 10% 
1 500 10% 
1,000 $5,000 100% 

请建议在R.

一个解决方案添加到代码获取样本数据和统计信息

library(Hmisc);library(data.table) 
set.seed(123) 
idrev<-data.table(ID=1:1000, Revenue=sample(100,1000,replace=T)) 
idrev[,.(.N,sum(Revenue))] #Check total revenue 
idrev[ , decile := cut2(Revenue,g=10)] 
idrev[,.(.N,sum(Revenue)),by=decile][order(decile)] 

回答

5

这里是一个应该让你有一个data.table唯一的方法:

idrev[order(Revenue), revDec := 10 * ceiling(10 * (cumsum(Revenue)/sum(Revenue)))] 

这是十分位数的按收入排序的行后,直接的计算。

这里是revDec合计收入的结果:

idrev[, .(Revenue=sum(Revenue)), by="revDec"] 
    revDec Revenue 
1:  10 5004 
2:  70 5070 
3:  20 5039 
4:  80 5025 
5:  90 4974 
6:  30 4974 
7:  40 5059 
8:  50 5026 
9: 100 5091 
10:  60 4960 

他们都非常接近5000

+0

非常感谢这个工作!不知道可以用这种方式使用cumsum – usct01

+1

在'data.table'内使用基本R函数的能力是这个包的重要特性之一。 – lmo