在我的数据中引用特定位置

时间:2013-04-17 02:53:53

标签: r

我是R的新手并试图解决问题。

以下是我的数据示例:

product_id             week           purchases
      53                0                   19              
      53                1                   27               
      53                2                   34                   
      53                3                   43                
      53                4                   44     

对于这些数据,有三种类型的product_id,而周变量每种都在0-15之间,每种都有正的购买价值。

我想添加一个名为百分比的第三个变量,并希望它等于购买/当周= 15时的购买价值,相关的产品数据ID。

我的问题是我不知道怎么告诉R我只想参考周= 15&在写这个等式时,我所在的行的产品ID。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

使用week==4代替15(因此它适用于您的示例数据)。所有这些结果都假设value == TRUE

只有一个week==4

您可以使用ave(和transform

transform(DF, prop.purchases = ave(purchases, product_id, FUN = function(x) x/ x[week==4]))

使用data.table

library(data.table)
DT <- data.table(DF)
DT[, prop.purchase := purchases / purchases[week==4], by = product_id]

使用密钥和by-without-by

的替代方法
DT <- data.table(DF, key = 'product_id')

DT[DT[week==4], prop.purchase := purchases / i.purchaes]

使用plyrddply

library(plyr)

ddply(DF, .(product_id), mutate,  prop.purchases = purchases / purchases[week==4])

答案 1 :(得分:0)

使用简单的ifelse来处理简单的样本数据:

将样本数据称为样本

sample data  (with added data for id 54 and 55: 
product_id  week    purchases
53  0   19
53  1   27
53  2   34
53  3   43
53  4   44
53  14  23
54  0   23
54  1   21
54  2   22
54  3   32
54  4   33
54  14  22
55  0   22
55  1   33
55  2   44
55  3   55
55  4   11
55  14  12


sample$percent<-with(sample,ifelse(product_id ==53, purchases/purchases[week==14 &product_id==53],ifelse(product_id ==54, purchases/purchases[week==14 & product_id==54],purchases/purchases[week==14 &product_id==55])))

Output: 
 product_id week purchases   percent
1          53    0        19 0.8260870
2          53    1        27 1.1739130
3          53    2        34 1.4782609
4          53    3        43 1.8695652
5          53    4        44 1.9130435
6          53   14        23 1.0000000
7          54    0        23 1.0454545
8          54    1        21 0.9545455
9          54    2        22 1.0000000
10         54    3        32 1.4545455
11         54    4        33 1.5000000
12         54   14        22 1.0000000
13         55    0        22 1.8333333
14         55    1        33 2.7500000
15         55    2        44 3.6666667
16         55    3        55 4.5833333
17         55    4        11 0.9166667
18         55   14        12 1.0000000