找到重量的频率

时间:2018-01-17 11:36:35

标签: r

我有以下日期数据:

<ComponentB/>

现在我想根据动态重量的日期找到项目频率。 动态重量意味着:最新日期将有1个重量,下一个日期(小于最新)应该具有不到10%的最新日期重量等... 例如:

我在上面的数据集中有4个日期。所以重量应该是:

item,Date
camera,10/12/2017
mobile,10/12/2017
mobile,15/12/2017
camera,15/12/2017
mobile,15/12/2017
mobile,15/12/2017
mobile,25/12/2017
mobile,25/12/2017
camera,25/12/2017
camera,25/12/2017
camera,05/01/2018
laptop,05/01/2018
laptop,05/01/2018
computer,05/01/2018

新数据集应如下所示:

Date        Weight
05/01/2018  1
25/12/2017  .90 (1 - 10% of 1)  
15/12/2017  .81 (.90 - 10% of .90)
10/12/2017  0.729 (.81 - 10% of .81)

1 个答案:

答案 0 :(得分:2)

包含rleseq_alonginverse.rle的可能解决方案:

df <- df[order(df$Date, decreasing = TRUE),]

rl <- rle(as.character(df$Date))
rl$values <- seq_along(rl$values) - 1

df$weights <- 0.9 ^ inverse.rle(rl)

给出:

> df[order(df$Date),]
       item       Date weights
1    camera 2017-12-10   0.729
2    mobile 2017-12-10   0.729
3    mobile 2017-12-15   0.810
4    camera 2017-12-15   0.810
5    mobile 2017-12-15   0.810
6    mobile 2017-12-15   0.810
7    mobile 2017-12-25   0.900
8    mobile 2017-12-25   0.900
9    camera 2017-12-25   0.900
10   camera 2017-12-25   0.900
11   camera 2018-01-05   1.000
12   laptop 2018-01-05   1.000
13   laptop 2018-01-05   1.000
14 computer 2018-01-05   1.000

这是做什么的:

  • 使用df[order(df$Date, decreasing = TRUE),],您可以从最近的日期到最早的日期订购数据框。如果您的日期列尚未采用日期格式,请先使用df$Date <- as.Date(df$Date, '%d/%m/%Y')进行转换。
  • 使用rl <- rle(as.character(df$Date)),您可以创建日期的行程编码。要查看其功能,请查看rle(as.character(df$Date))
  • 的输出
  • rle - 对象的值替换为seq_along(rl$values) - 1
  • 现在,您可以使用0.9 ^ inverse.rle(rl)计算权重。