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