R中

2016-05-10 45 views
0
创建自定义的加权变量

我的数据集看起来像这样R中

set.seed(1) 
data <- data.frame(ITEMID = 101:120,DEPT = c(rep(1,10),rep(2,10)), 
        CLASS = c(1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2), 
        SUBCLASS = c(3,3,3,3,4,4,4,4,4,3,3,3,3,3,3,4,4,4,4,4), 
        PRICE = sample(1:20,20),UNITS = sample(1:100,20) 
        ) 


> data 
    ITEMID DEPT CLASS SUBCLASS PRICE UNITS 
1  101 1  1  3  6 94 
2  102 1  1  3  8 22 
3  103 1  1  3 11 64 
4  104 1  1  3 16 13 
5  105 1  1  4  4 26 
6  106 1  2  4 14 37 
7  107 1  2  4 15  2 
8  108 1  2  4  9 36 
9  109 1  2  4 19 81 
10 110 1  2  3  1 31 
11 111 2  1  3  3 44 
12 112 2  1  3  2 54 
13 113 2  1  3 20 90 
14 114 2  1  3 10 17 
15 115 2  1  3  5 72 
16 116 2  2  4  7 57 
17 117 2  2  4 12 67 
18 118 2  2  4 17  9 
19 119 2  2  4 18 60 
20 120 2  2  4 13 34 

现在我想用下面的逻辑

以项目ID 101添加一个名为PRICE_RATIO另一列,并与DEPT,类和子类GROUP_BY产量价格c(6,8,11,16)和ITEMIDs c(101,102,103,104)分别

现在每个项目ID的变量PRICE_RATIO将是项目ID的价格加权价格的比率UNITS c(94,22,64,13)的组中所有其他itemID。例如

对于项目ID其他101c(102,103,104)其总单位(22+ 64+13) =99和重量(22/99,64/99,13/99)。因此所有其他项目的加权价格是(22/99)*8 + (64/99)*11 + (13/99)*16 = 10.9899。因此PRICE_RATIO的值将为6/10.9899= .54

对于所有其他项目类似。

创建的代码,这将大大任何帮助表示赞赏

回答

1

一个解决问题的方法,一般这样的问题可以通过使用dplyr包及其数据改写(munging)能力。这里的逻辑就像你说的那样,按照期望的列进行分组,然后改变期望值(价格和单位的总和(不包括该特定行的产品)和价格与该权重的比率)。这个单独计算(我鼓励这样你可以学到),看看到底它做什么

library(dplyr) 
data %>% 
    group_by(DEPT, CLASS, SUBCLASS) %>% 
    mutate(price_ratio = round(PRICE/
          ((sum(UNITS * PRICE) - UNITS * PRICE)/
           (sum(UNITS) - UNITS)), 
          2)) 

输出如下:

Source: local data frame [20 x 7] 
Groups: DEPT, CLASS, SUBCLASS [6] 

    ITEMID DEPT CLASS SUBCLASS PRICE UNITS price_ratio 
    <int> <dbl> <dbl> <dbl> <int> <int>  <dbl> 
1  101  1  1  3  6 94  0.55 
2  102  1  1  3  8 22  0.93 
3  103  1  1  3 11 64  1.50 
4  104  1  1  3 16 13  1.99 
5  105  1  1  4  4 26   NaN 
6  106  1  2  4 14 37  0.88 
7  107  1  2  4 15  2  0.97 
8  108  1  2  4  9 36  0.52 
9  109  1  2  4 19 81  1.63 
10 110  1  2  3  1 31   NaN 
11 111  2  1  3  3 44  0.29 
12 112  2  1  3  2 54  0.18 
13 113  2  1  3 20 90  4.86 
14 114  2  1  3 10 17  1.08 
15 115  2  1  3  5 72  0.46 
16 116  2  2  4  7 57  0.48 
17 117  2  2  4 12 67  0.93 
18 118  2  2  4 17  9  1.36 
19 119  2  2  4 18 60  1.67 
20 120  2  2  4 13 34  1.03 
+0

,完美的工作 –