![](/img/trans.png)
[英]R How to get the difference between current and next row that matches certain condition?
[英]Difference between row with certain value (0) and next row in R
我正在寻找一种编程方式,让我的脚本在唯一的产品ID中搜索0库存,然后计算下一行的日期之间的差。
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,您希望在sys.date()以0结尾时取其值,因此一个从2017-04-05到2017-04-13(今天)。
请有人可以帮助我,我更喜欢使用dplyr软件包。 我尝试了不同的方法,但找不到解决方案(group_by-> if.else(stock == 0)等)
您可以通过按ID分组来实现此目的,使用dplyr的lead()
函数创建一个Time
列,其中包含每种状态下的时间量,然后进行summarize
:
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
有四年的差距
按ID分组,使用Lead从下一个日期减去,确定NA,然后使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.