以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
但是,我实际上需要存储一个具有给定结果的ID
列表。我可以使用以下方式为给定的一对ID
收集(V1, V2)
列表:
> 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)
答案 0 :(得分:4)
在对数据行进行分组之后(按“ V1”,“ V2”分组),创建list
的{{1}}“ ID”
unique
答案 1 :(得分:0)
dt[, .(ID = .(unique(ID))), by = .(V1, V2)
][dt[, .(V2 = if (uniqueN(V2) > 1) unique(V2) else numeric(0)), by = V1], on = .(V1, V2)]
分为以下几步:
# Extract our pairs of interests first
our_pairs <- dt[, .(V2 = if (uniqueN(V2) > 1) unique(V2) else numeric(0)), by = V1]
our_pairs
# V1 V2
# 1: 2 5
# 2: 2 6
# 3: 2 7
# Aggregate all ID's for each pair on original data
ids_forpairs <- dt[, .(ID = .(unique(ID))), by = .(V1, V2)]
ids_forpairs
# V1 V2 ID
# 1: 1 4 1,2,3
# 2: 2 5 1,2
# 3: 2 6 2
# 4: 2 7 1,3
# 5: 3 4 1
# 6: 4 5 1
# Then filter by our pairs of interest
ids_forpairs[our_pairs, on = .(V1, V2)]
# V1 V2 ID
# 1: 2 5 1,2
# 2: 2 6 2
# 3: 2 7 1,3