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

时间:2017-04-13 14:23:35

标签: r dplyr

我正在寻找一种方法来编程我的脚本在唯一的产品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. 产品1平均缺货7/25天。

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

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

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

  3. 对于第三个#ID,当它以0结尾时,你想要使用sys.date(),这样一个是从2017-04-05到2017-04-13(今天)。

  4. 请有人帮助我,我更喜欢使用dplyr包。我尝试了不同的方法,但我找不到解决方案(group_by - > if.else(stock == 0)等)。

2 个答案:

答案 0 :(得分:2)

您可以按ID进行分组,使用dplyr&#39; 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-162015-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