我有一个data.table,包含3列。前两列是关键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
我需要筛选此表格,使得每个 Policy 和 Vehicle 的 Value 值都是唯一的。因此第 4 行将保留,但第 9 行将被筛选,因为在 [Pol_No:c , Veh_No:1] 已经分配了值 4。
期望结果如下:
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]中使用过了,因此仍然是错误的。
有什么办法可以过滤掉已经在同一键集中使用过的行吗?
out <- DT[0];for(nm in unique(DT$Pol_No)) {tmp <- DT[Pol_No == nm]; for(nm2 in unique(tmp$Veh_No)) {tmp2 <- na.omit(tmp)[Veh_No == nm2];out <- rbind(out, tmp2[1]); tmp[Value %in% tmp2$Value[1], Value := NA]}}; out
- akrun