删除data.table中的所有重复项,并添加带有标识符列表的列

时间:2019-05-24 14:41:24

标签: r data.table

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

具有很多重复的行(当查看V1V2时)。

我想删除所有“完全重复”的行(对于给定的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)

2 个答案:

答案 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