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

标签 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 组中可能会出现多个标签):

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 来完成,但到目前为止我只使用了简单的语句。

最佳答案

我认为合并 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/

相关文章:

r - 根据R中的条件计算日期之间的平均差

r - 如何使用神经网络包预测新病例

r - 如何同时测试R中多个变量的正态性?

递归累积函数

r - 通过引用删除整个 data.table

python - 使用 PyParsing 匹配 2 个以上空格

python - 提取美元金额

full-text-search - Solr:如何在文本字段上搜索完整匹配项?是否有隐藏的 equal() 运算符?

在 R 中读取具有不同列宽但固定分隔符的文本文件

r - 如何在不使用两个 for 循环的情况下填充我的 data.table?