2017-04-13 8 views
0

私のスクリプトが一意の製品IDの0株を検索し、次の行の日付の差を計算する方法を探しています。特定の値(0)と次の行を持つ行との差異がR

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月5日= 25日。

  2. 2番目の#ID2は在庫切れ(29日)です。

  3. 3番目の#IDでは、sys.date()が0で終了するときに、2017-04-05から2017-04-13(今日)になるようにします。

私は誰でも助けることができます、私はdplyrパッケージを使用することを好むことができます。

+2

2015年12月30日 - 2010年12月5日の25日ではありません、それは1840年の日(2010年から2015年までスキップ)です。それは意図的なのでしょうか? –

+0

いいえ、意図的ではありませんでした!それは2010年12月30日でなければなりませんでしたが、質問の考え方に大きな違いはありません。お返事ありがとうございました。 – user5424264

答えて

2

あなたはTime列を作成するためにdplyrのlead()機能を使用して、IDによってグループ化することによってこれを行うことができます - (> if.else(株== 0)などGROUP_BY)私は別のアプローチを試みたが、私は解決策を見つけることができませんでしたその後、summarize各状態での時間の量、と:最初の値は.0037と低い理由があることであることを

# A tibble: 3 × 2 
    ID PercentZero 
    <int>  <dbl> 
1  1 0.00378174 
2  2 0.23200000 
3  3 0.00000000 

注:お使いのデータに

library(dplyr) 

d %>% 
    group_by(ID) %>% 
    mutate(Time = as.integer(lead(Date, default = Sys.Date()) - Date)) %>% 
    summarize(PercentZero = sum(Time[Stock == 0])/sum(Time)) 

、これは、その結果四人arギャップは2010-12-16から2015-12-30

+0

ありがとうDavid! – user5424264

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

ありがとう、Axeman! – user5424264

関連する問題