【问题标题】:Removing all duplicates in data.table, adding column with list of identifiers删除 data.table 中的所有重复项,添加带有标识符列表的列
【发布时间】: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

有许多重复的行(查看 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

但是,我实际上需要存储具有给定结果的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


    【解决方案1】:

    对数据行进行子集化后,按“V1”、“V2”分组,创建list of unique“ID”

    dt[dt[, .(i1 = .I[uniqueN(V2) > 1]), V1]$i1][, .(ID = list(unique(ID))), .(V1, V2)]
    #   V1 V2  ID
    #1:  2  5 1,2
    #2:  2  6   2
    #3:  2  7 1,3
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2022-10-04
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        相关资源
        最近更新 更多