R:匹配> =组中其他行的数字行

时间:2014-03-14 21:39:21

标签: r match data.table

是否可以将两个表相互匹配,其中一个变量> =另一个变量,但是在一个组中?

df <- data.frame(ID=c(rep(1,6),rep(2,4)), 
                 IDSEQ=c(seq(1,6),seq(1,4)), 
                 TAG = c(0,0,1,0,1,0,0,1,0,0))

以下是表格的简要示例:

ID  IDSEQ TAG
1   1     0
1   2     0
1   3     1
1   4     0
1   5     1
1   6     0
2   1     0
2   2     1
2   3     0
2   4     0

我已经创建了一些查找(需要使用min来完成,因为每个ID组中可能会出现几个TAG&#39;)

df2 <- df[which(df$TAG == 1), ]

library(data.table)
DT <- data.table(df2)
DT <- DT[, list(IDSEQ=min(IDSEQ)), by=ID]

ID  IDSEQ
1   3
2   2

我在考虑按ID df$ID == DT$IDdf$IDSEQ >= DT$IDSEQ对行进行编号,但可能还有其他方法可以解决这个问题。

结果应如下所示。

ID  IDSEQ TAG   CASES
1   1     0     0
1   2     0     0
1   3     1     1
1   4     0     2
1   5     1     3
1   6     0     4
2   1     0     0
2   2     1     1
2   3     0     2
2   4     0     3

我认为这可以用data.table完成,但到目前为止我只使用了简单的语句。

1 个答案:

答案 0 :(得分:2)

我认为合并data.tables可能在这里很有用。有点像...

DT0 <- data.table(df)
setkey(DT0,ID) # the first data.table in a merge must be keyed

DT0[DT,IDSEQ >= i.IDSEQ] # this labels whether each row satisfies the condition

我不确定前缀i.的记录位置,但它引用了X[Y,...]联接中第二个表中的列。


我仍然试图找到一种优雅的方式来对群组中的行进行编号。这是一种笨拙的方法:

DT0[,CASES:=0L]
DT0[DT0[DT,.I[IDSEQ >= i.IDSEQ]]$V1,CASES:=1:.N,by=ID]

给出了

    ID IDSEQ TAG CASES
 1:  1     1   0     0
 2:  1     2   0     0
 3:  1     3   1     1
 4:  1     4   0     2
 5:  1     5   1     3
 6:  1     6   0     4
 7:  2     1   0     0
 8:  2     2   1     1
 9:  2     3   0     2
10:  2     4   0     3

这使用.I中记录的特殊变量.Nhelp('data.table')