我正在寻找一种方法来编程我的脚本在唯一的产品ID中搜索0 Stock并计算下一行的日期之间的差异。
ID Stock Date
1 1 2010-12-05
1 0 2010-12-09
1 1 2010-12-16
1 3 2015-12-30
2 10 2015-01-05
2 0 2015-03-07
2 2 2015-03-27
2 0 2015-05-01
2 6 2015-05-10
3 4 2010-05-05
3 3 2017-02-02
3 0 2017-04-05
我想计算产品ID有库存0的时间百分比。
产品1平均缺货7/25天。
缺货#ID1:2010-12-16 - 2010-12-09 = 7天
库存总时间#ID1:2015-12-30 - 2010-12-05 = 25天。
第二个#ID2,缺货两次(29天)。
对于第三个#ID,当它以0结尾时,你想要使用sys.date(),这样一个是从2017-04-05到2017-04-13(今天)。
请有人帮助我,我更喜欢使用dplyr包。我尝试了不同的方法,但我找不到解决方案(group_by - > if.else(stock == 0)等)。
答案 0 :(得分:2)
您可以按ID进行分组,使用dplyr' lead()
函数创建Time
列,其中包含每个州的时间量,然后summarize
:< / p>
library(dplyr)
d %>%
group_by(ID) %>%
mutate(Time = as.integer(lead(Date, default = Sys.Date()) - Date)) %>%
summarize(PercentZero = sum(Time[Stock == 0]) / sum(Time))
在您的数据上,结果是:
# A tibble: 3 × 2
ID PercentZero
<int> <dbl>
1 1 0.00378174
2 2 0.23200000
3 3 0.00000000
请注意,第一个值低至.0037
的原因是,从2010-12-16
到2015-12-30
答案 1 :(得分:1)
按ID分组,使用导联从下一个日期减去,修复NAs,然后使用first和last汇总总数。
df %>%
group_by(ID) %>%
mutate(Date = as.Date(Date),
out = ifelse(Stock == 0, lead(Date) - Date, 0),
out = ifelse(is.na(out), Sys.Date() - Date, out)) %>%
summarise(out = sum(out),
total = last(Date) - first(Date),
fract = out / total)
给出:
# A tibble: 3 × 4 ID out total fract <int> <dbl> <time> <dbl> 1 1 7 1851 days 0.003781740 2 2 29 125 days 0.232000000 3 3 8 2527 days 0.003165809