2016-06-21 52 views
4

,我有以下数据集作为data.table(DT):顺序集团通过使用data.table

    time wea 
1 2016-06-16 00:04:50 cloudy 
2 2016-06-16 02:14:55 cloudy 
3 2016-06-16 03:19:04 cloudy 
4 2016-06-16 04:19:24 cloudy 
5 2016-06-16 05:23:45 cloudy 
6 2016-06-16 06:25:05 cloudy 
7 2016-06-16 07:26:46 cloudy 
8 2016-06-16 08:27:06 cloudy 
9 2016-06-16 09:34:09 sunny 
10 2016-06-16 10:36:29 sunny 
11 2016-06-16 11:39:09 sunny 
12 2016-06-16 12:39:29 sunny 
13 2016-06-16 13:44:50 rainy 
14 2016-06-16 14:46:31 rainy 
15 2016-06-16 15:47:12 rainy 
16 2016-06-16 16:48:12 rainy 
17 2016-06-16 17:49:54 sunny 
18 2016-06-16 18:50:34 sunny 
19 2016-06-16 19:51:34 cloudy 
20 2016-06-16 20:53:55 cloudy 
21 2016-06-16 21:56:51 cloudy 
22 2016-06-16 22:30:42 cloudy 
23 2016-06-16 23:26:14 cloudy 

而且我想这一点:

wea start.point end.point 
1: cloudy   1  8 
2: sunny   9  12 
3: rainy   13  16 
4: sunny   17  18 
5: cloudy   19  23 

我试图运行以下,但没有成功

dt[, .(start.point = head(.I,1), end.point = tail(.I,1)) , by="wea"] 

因为“by”将第二个“阴天”块与第一个“阴天”块一起分组,但我想分开连续的块。

+3

一般最好在你想和什么样的语言来解释,而不是仅仅显示所需的输出。 – Frank

回答

5

您可以使用.Iby语句中创建索引并rleid来分隔后续部分。使用:

dt[, .(start.point = .I[1], end.point = .I[.N]), by = .(wea, rleid(wea)) 
    ][, rleid := NULL][] 

给出:

 wea start.point end.point 
1: cloudy   1   8 
2: sunny   9  12 
3: rainy   13  16 
4: sunny   17  18 
5: cloudy   19  23 
+0

我不知道函数'rleid'。它运作良好。谢谢!! –