2016-08-25 7 views
4

IDと収益の2つの列を持つデータがあります。私は総収入の10%を持つ10のグループのデータを分割する列を作成したいと思います。分位法は私に、収益ではなく同じ数のIDを持つ10のグループを与えます。私はこの結果それぞれの値が同じ合計10個のグループに行を分割します。

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% 

を探していながら

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% 

私はタイプの結果、次の取得

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

にコードを追加する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関数を使用する能力は、このパッケージの大きな特徴の1つです。 – lmo

関連する問題