2015-10-26 51 views
3

我有一个大data.frame结构作为索引:如何创建,连续和非连续几天

date torn_count torn_dpi 
31-12-2014 1 0.001 
28-12-2014 3 0.003 
27-12-2014 1 0.001 
22-12-2014 1 0.001 
21-12-2014 1 0.001 
20-12-2014 1 0.001 
19-12-2014 1 0.001 
18-12-2014 1 0.001 
17-12-2014 3 0.003 
15-12-2014 2 0.002 
14-12-2014 1 0.001 
13-12-2014 1 0.002 
11-12-2014 5 0.104 
10-12-2014 3 0.003 
09-12-2014 1 0.001 
08-12-2014 5 0.104 
01-12-2014 5 0.014 
30-11-2014 2 0.002 
29-11-2014 1 0.001 
26-11-2014 1 0.001 
25-11-2014 2 0.045 
24-11-2014 2 1.83 

我想补充一点,有超过连续三天的值相同的指标,增加在非连续的日子里。例如:

date torn_count torn_dpi index 
31/12/2014 1 0.001 1 
28/12/2014 3 0.003 2 
27/12/2014 1 0.001 2 
22/12/2014 1 0.001 3 
21/12/2014 1 0.001 3 
20/12/2014 1 0.001 3 
19/12/2014 1 0.001 3 
18/12/2014 1 0.001 3 
17/12/2014 3 0.003 3 
15/12/2014 2 0.002 4 
14/12/2014 1 0.001 4 
13/12/2014 1 0.002 4 

对上述问题的任何帮助将不胜感激。

回答

4

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df1)),将'date'转换为Date类,得到相邻元素之间的差异,检查它是否不等于1,并且执行cumsum来创建'索引'栏。

library(data.table) 
setDT(df1)[, index:= cumsum(c(TRUE,abs(diff(as.Date(date, '%d-%m-%Y')))!=1))] 
head(df1, 12) 
#   date torn_count torn_dpi index 
# 1: 31-12-2014   1 0.001  1 
# 2: 28-12-2014   3 0.003  2 
# 3: 27-12-2014   1 0.001  2 
# 4: 22-12-2014   1 0.001  3 
# 5: 21-12-2014   1 0.001  3 
# 6: 20-12-2014   1 0.001  3 
# 7: 19-12-2014   1 0.001  3 
# 8: 18-12-2014   1 0.001  3 
# 9: 17-12-2014   3 0.003  3 
#10: 15-12-2014   2 0.002  4 
#11: 14-12-2014   1 0.001  4 
#12: 13-12-2014   1 0.002  4