R 连续行数

R 连续行数,r,data.table,R,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
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
尝试:

dat[,grp := cumsum(c(1,diff(year)) > 1),by=list(id1,id2)]
dat[,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 65122111   1 2007      2
#3: 51557093 65122111   0 2006      1
尝试:

dat[,grp := cumsum(c(1,diff(year)) > 1),by=list(id1,id2)]
dat[,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 65122111   1 2007      2
#3: 51557093 65122111   0 2006      1

首先,让我们构建您的表

library(data.table)
dtId <- data.table(
  id1 = c(rep(51557094, 5), 51557093),
  year = c(2000 + c(3, 4, 5, 7, 8, 6)),
  id2 = rep(65122111, 6)
  )

首先,让我们构建您的表

library(data.table)
dtId <- data.table(
  id1 = c(rep(51557094, 5), 51557093),
  year = c(2000 + c(3, 4, 5, 7, 8, 6)),
  id2 = rep(65122111, 6)
  )

我接受了你的答案,但请注意,你可能想要修正它(请参阅更新的问题)。我接受了你的答案,但请注意,你可能想要修正它(请参阅更新的问题)。
dtAggr[, match := NULL]
dtAggr