代码之家  ›  专栏  ›  技术社区  ›  yuskam

从具有相似id的不同行中排除重复的值

  •  1
  • yuskam  · 技术社区  · 8 年前

    我有一个数据集,其中不同的值位于一列中。我知道这不是一个好的做法,但这是我无法控制的。示例数据集如下所示:

    library(data.table)
    a1 <- data.table(v1 = "a", v2 = "12,13,12,12,10")
    a2 <- data.table(v1 = "b", v2 = "10,10,11,12")
    a3 <- data.table(v1 = "b", v2 = "10,10,13,14,12")
    DT <- rbindlist(list(a1, a2, a3))
    

    我想创建一个新列,其中只包含两行中“b”中的唯一值。我试过这个:

    DT[, v5 := paste(unlist(lapply(v2, function(x) unique(unlist(strsplit(as.character(x), ",", fixed = TRUE))))), collapse = ","), by = v1]
    

    但它只排除每行中重复的值。我得到的是:

       v1             v2                   v5
    1:  a 12,13,12,12,10             12,13,10
    2:  b    10,10,11,12 10,11,12,10,13,14,12
    3:  b 10,10,13,14,12 10,11,12,10,13,14,12
    

    我希望在列“v5”中为行“b”获取的值是10、11、12、13、14。

    我非常感谢它对解决问题的指导。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Onyambu    8 年前
    DT[DT[,toString(unique(scan(text = v2,sep = ","))),by=v1],on="v1"]
    Read 5 items
    Read 9 items
       v1             v2                 V1
    1:  a 12,13,12,12,10         12, 13, 10
    2:  b    10,10,11,12 10, 11, 12, 13, 14
    3:  b 10,10,13,14,12 10, 11, 12, 13, 14
    

    您可以包括 quiet=T 以避免打印读取的项目数:

    DT[DT[,toString(unique(scan(text = v2,sep = ",",quiet = T))),by=v1],on="v1"]
       v1             v2                 V1
    1:  a 12,13,12,12,10         12, 13, 10
    2:  b    10,10,11,12 10, 11, 12, 13, 14
    3:  b 10,10,13,14,12 10, 11, 12, 13, 14
    
    DT[DT[,toString(unique(unlist(strsplit(v2,",")))),by=v1],on="v1"]
       v1             v2                 V1
    1:  a 12,13,12,12,10         12, 13, 10
    2:  b    10,10,11,12 10, 11, 12, 13, 14
    3:  b 10,10,13,14,12 10, 11, 12, 13, 14
    

    使用 paste unlist

     DT[DT[,.(V5=paste(unique(unlist(strsplit(v2,","))),collapse=",")),by=v1],on="v1"]
       v1             v2             V5
    1:  a 12,13,12,12,10       12,13,10
    2:  b    10,10,11,12 10,11,12,13,14
    3:  b 10,10,13,14,12 10,11,12,13,14
    
        2
  •  1
  •   MKR    8 年前

    您非常接近解决方案。您必须总结( paste 具有 collapse )应用前的组 unique

    你可以试着总结一下 v1 作为:

    DT[, .(v5 = paste(unique(unlist(strsplit(paste(v2,collapse = ","),
                                  split = ","))),collapse=",")), by = v1]
    #    v1             v5
    # 1:  a       12,13,10
    # 2:  b 10,11,12,13,14