是否可以将两个表相互匹配,其中一个变量 >= 另一个,但在一组内?
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 组中可能会出现多个标签):
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
来完成,但到目前为止我只使用了简单的语句。
最佳答案
我认为合并 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')
中。
关于R:匹配 >= 组内其他行的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22416211/