考虑一个data.table
,其中包含id1
,id2
几年的匹配。连续行数
id1 year id2
1: 51557094 2003 65122111
2: 51557094 2004 65122111
3: 51557094 2005 65122111
4: 51557094 2007 65122111
5: 51557094 2008 65122111
6: 51557093 2006 65122111
对于这些比赛,我想找出时间,随着比赛开始的一年在一起。如果没有特定年份的数据,则比赛结束(并且在下一年,如果再次有数据,则开始新的比赛)。
因此,对于上面的样本数据,预期产量将
id1 year id2 length
1: 51557094 2003 65122111 3
2: 51557094 2007 65122111 2
3: 51557093 2006 65122111 1
我接受的答案之一,因为它给我带来的远远不够,但是请注意,这是不正确的。虽然它的工作对样本数据,也不会为下列
> dtId
id1 year id2
1: 51557094 2003 65122111
2: 51557094 2004 65122111
3: 51557094 2005 65122111
4: 51557094 2007 65122111
5: 51557094 2008 65122111
6: 51557094 2006 65122112
> setkey(dtId, id1, id2, year)
> dtId[,grp := cumsum(c(1,diff(year)) > 1),by=id1]
> dtId[,list(year=year[1],length=length(year)),by=list(id1,id2,grp)]
id1 id2 grp year length
1: 51557094 65122111 0 2003 5
2: 51557094 65122112 0 2006 1
相反,从而导致了在这两个id1, id2
比赛变量grp
解决了这个问题:
> dtId[,grp := cumsum(c(1,diff(year)) > 1),by=list(id1, id2)]
> dtId[,list(year=year[1],length=length(year)),by=list(id1,id2,grp)]
id1 id2 grp year length
1: 51557094 65122111 0 2003 3
2: 51557094 65122112 0 2006 1
3: 51557094 65122111 1 2007 2
我接受了您的答案,但请注意您可能需要修复它(请参阅更新后的问题)。 – FooBar 2014-12-04 16:50:28