首页 > 解决方案 > 为 data.table (r) 中的每个 ID 选择第一个唯一匹配项

问题描述

我有一个由 3 列组成的 data.table。前 2 列是键 ID,第三列表示 ID 可以具有的所有可能值。

这是一个例子:

DT <- data.table( 
            Pol_No = c('a','b','b','c','c','c','c','c','c','c')  
          , Veh_No = c(1,1,2,1,1,1,2,3,3,3)
          , Value = c(1,1,2,3,4,5,6,3,4,5)
          )
DT
    Pol_No Veh_No Value
 1:      a      1     1
 2:      b      1     1
 3:      b      2     2
 4:      c      1     3
 5:      c      1     4
 6:      c      1     5
 7:      c      2     6
 8:      c      3     3
 9:      c      3     4
10:      c      3     5

我需要过滤此表,以便每个策略和车辆的值都是唯一的。所以第 4 行将保留,但第 9 行将被过滤,因为 4 的值已经分配给 [Pol_No:c , Veh_No:1]

预期结果是:

   Pol_No Veh_No Value
1:      a      1     1
2:      b      1     1
3:      b      2     2
4:      c      1     3
5:      c      2     6
6:      c      3     4

我尝试了很多可能性,但我能想到的最好的是:

Flt <- 
  DT[DT
     , .(Value)
     , on = .(Pol_No , Veh_No )
     , mult = 'first']
DT[ Value == Flt$Value,]

   Pol_No Veh_No Value
1:      a      1     1
2:      b      1     1
3:      b      2     2
4:      c      1     3
5:      c      2     6
6:      c      3     3

这几乎是正确的,但是 [c,3] 的值已经在 [c,1] 中使用过,所以它仍然是错误的。

如果一行已经在同一个键集中使用,如何过滤掉它的任何想法?

标签: rjoinfilterdata.table

解决方案


这样的事情怎么样?

DT[,Count := sequence(.N),by = .(Pol_No,Value)][,.SD[min(Count),],by = .(Pol_No,Veh_No)]
   Pol_No Veh_No Value Count
1:      a      1     1     1
2:      b      1     1     1
3:      b      2     2     1
4:      c      1     3     1
5:      c      2     6     1
6:      c      3     4     2

Count您可以稍后摆脱该列。


推荐阅读