我有以下日期数据:
<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)
答案 0 :(得分:2)
包含rle
,seq_along
和inverse.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)
计算权重。