2016-04-28 14 views
5

Veri çerçevem ​​nasıl görünüyor. En sağdaki sütun ("TimeForLevelChange") istenen sütüm. Belirli bir İsim için bir seviye değiştiğinde, minimum seviyeyi önceki seviyeden almak ve seviye değişikliğinin gerçekleştiği satırdan tarihi almak ve farkı hesaplamak istiyorum. Yani üçüncü satırda, John seviye 1'den 2'ye değişti ve o 16 gün (2016/01/17 - 2016/01/01) harcanan seviyeye değiştirmeden önce düzeyinde 1'de 2.Bu seviye değiştiğinde belirli bir düzeyde harcanan zamanın hesaplanması

library(data.table) 
     dt <- fread(' 
      Name  Level  Date   RecentLevelChange TimeForLevelChange 
      John  1  2016-01-01  NA     NA 
      John  1  2016-01-10  NA     NA 
      John  2  2016-01-17  1->2    16 
      John  2  2016-01-18  NA     NA 
      John  3  2016-01-22  2->3    5 
      John  4  2016-01-26  3->4    4 
      John  4  2016-01-27  NA     NA 
      John  7  2016-01-29  4->7    3 
      Tom  1  2016-01-10  NA    NA 
      Tom  2  2016-01-17  1->2    7 
      Tom  2  2016-01-18  NA    NA 
      Tom  3  2016-01-22  2->3    5 
      Tom  4  2016-01-26  3->4    4 
      Tom  4  2016-01-27  NA    NA 
      Tom  7  2016-01-29  4->7    3 
     ') 
dt[, Date := as.IDate(Date)] 

Ben ayarını kullanabilirsiniz data.table işlevinde ancak belirli bir ad için minimum düzeyden önceki tarihin nasıl tanımlanacağını bilmiyorum.

cevap

7

Ben ikinci hata veriyor çünkü {.()} yerine .() kullanmak

Name Level  Date RecentLevelChange TimeForLevelChange dur_lastspell 
1: John  1 2016-01-01    NA     NA  NA days 
2: John  1 2016-01-10    NA     NA  NA days 
3: John  2 2016-01-17    1->2     16  16 days 
4: John  2 2016-01-18    NA     NA  NA days 
5: John  3 2016-01-22    2->3     5  5 days 
6: John  4 2016-01-26    3->4     4  4 days 
7: John  4 2016-01-27    NA     NA  NA days 
8: John  7 2016-01-29    4->7     3  3 days 
9: Tom  1 2016-01-10    NA     NA  NA days 
10: Tom  2 2016-01-17    1->2     7  7 days 
11: Tom  2 2016-01-18    NA     NA  NA days 
12: Tom  3 2016-01-22    2->3     5  5 days 
13: Tom  4 2016-01-26    3->4     4  4 days 
14: Tom  4 2016-01-27    NA     NA  NA days 
15: Tom  7 2016-01-29    4->7     3  3 days 

veren

spell = dt[,{.(
    w = .I[1L], 
    Date = Date[1L] 
)}, by=.(Name, rleid(Level))][, .(
    w = tail(w,-1), 
    d = diff(Date) 
), by=Name] 

dt[spell$w, dur_lastspell := spell$d] 

yapabilir. Bir hata olarak bildiririm.

İlgili konular