r - 为 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] 中使用过,所以它仍然是错误的。
如果一行已经在同一个键集中使用,如何过滤掉它的任何想法?
解决方案
这样的事情怎么样?
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
您可以稍后摆脱该列。
推荐阅读
- react-native - 在 Expo 中配置 Math.random()
- flutter - Flutter:在启动时显示一个对话框
- javascript - 在 React Web 应用程序中通过数组映射返回“未定义”
- javascript - 如何使用 alpha beta 剪枝实现转置表
- python-3.x - 为什么我不能制作具有大量值的相关矩阵
- arrays - 如何复制字节数组
- vb.net - 是否可以将 VB.Net MDI 子窗体移动到另一个屏幕?
- python - 在 Pandas df 行中查找值并返回列名
- python - 如何使用正则表达式将字符串拆分为不同长度的块
- android - 询问用户是否允许录制音频、读取手机状态和前台服务?