是否可以将两个表相互匹配,其中一个变量> =另一个变量,但是在一个组中?
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$ID
和df$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
完成,但到目前为止我只使用了简单的语句。
答案 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
中记录的特殊变量.N
和help('data.table')
。