繁体   English   中英

具有特定值(0)的行与R中的下一行之间的差异

[英]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. 产品1平均缺货7/25天。

    • 缺货#ID1:2010-12-16-2010-12-09 = 7天

    • 库存#ID1总时间:2015-12-30-2010-12-05 = 25天。

  2. 第二个#ID2缺货两次(29天)。

  3. 对于第三个#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-162015-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM