【发布时间】:2019-05-24 14:41:23
【问题描述】:
基于my previous question,我有以下data.table:
> dt = data.table(V1 = c(1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4),
V2 = c(4, 4, 4, 5, 5, 6, 6, 7, 7, 4, 5),
ID = c(1, 2, 3, 1, 2, 2, 2, 1, 3, 1, 1))
V1 V2 ID
1: 1 4 1
2: 1 4 2
3: 1 4 3
4: 2 5 1
5: 2 5 2
6: 2 6 2
7: 2 6 2
8: 2 7 1
9: 2 7 3
10: 3 4 1
11: 4 5 1
有许多重复的行(查看 V1 和 V2 时)。
我想删除所有“完全重复”的行(那些V2 对于给定的V1 总是相同的行),包括具有唯一V1 的行(因为所有一个V2 都相等对自己)。
在上面链接的上一个问题中,我得到了许多解决方案,包括@akrun(针对这个新表进行了修改):
> newDT = unique(dt[dt[, .(i1 = .I[uniqueN(V2) > 1]), V1]$i1], by = c("V1", "V2"))
V1 V2 ID
1: 2 5 1
2: 2 6 2
3: 2 7 3
但是,我实际上需要存储具有给定结果的IDs 列表。我可以轻松地收集给定一对(V1, V2) 的IDs 列表
> unique(dt[V1 == 2 & V2 == 5, ID])
[1] 1 2
(unique 是必要的,因为给定的(V1,V2) 对也可能有重复的ID,请参阅dt 行 6:7)并添加它
newDT[, ID := .(.(unique(dt[V1 == 2 & V2 == 5, ID])))]
但我不知道如何“迭代”每个 (V1,V2) 对。
总之,我需要输出是
> newDT
V1 V2 ID
1: 2 5 (1, 2)
2: 2 6 (2)
3: 2 7 (1, 3)
【问题讨论】:
标签: r data.table