2017-04-13 46 views
0

我正在尋找一種方法來編程,以便我的腳本搜索唯一產品ID中的0股票並計算下一行的日期之間的差異。在R中具有特定值(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. 對於第三個#號,你想採取sys.date()時,它以0結束,所以一個是從2017-04-05到2017-04-13(今天)。

請任何人都可以幫助我,我更喜歡使用dplyr軟件包。我嘗試不同的方法,但我無法找到一個解決方案(GROUP_BY - > if.else(股票== 0)等)

+2

二○一五年十二月三十〇日 - 2010-12-05不是25天,這是1840天(從2010年跳到2015年)。那是故意的嗎? –

+0

不是不是故意的!它必須是2010年12月30日,但這個問題的想法並沒有太大的區別。非常感謝你的回答! – user5424264

回答

2

您可以通過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的是,有一個四個你ar間隙從2010-12-162015-12-30

+0

非常感謝大衛! – user5424264

1

按ID分組,使用導致從下一個日期減去,修復NA,然後總結使用第一個和最後一個總數。

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 
+0

非常感謝你Axeman! – user5424264

相關問題