数据表中的条件排序

时间:2017-08-14 13:45:53

标签: r data.table trim

我有非常大的data.table,我想以这种方式减少:

  1. 只有一个唯一ID
  2. 如果同一个日志中存在除“X”之外的任何其他数据,则该另一个数据应保留
  3. 如果只有X,那么第一个X应该保留
  4. 如果除了“X”之外还有不止一个,那么所有这些都应该留下来,用逗号分隔,但不能用“X”分隔。
  5. 示例数据集:

    library(data.table)
    dt <- data.table(
        id=c(1,1,2,3,3,4,4,4,5,5),
        log=c(11,11,11,12,12,12,12,12,13,13),
        art=c("X", "Y", "X", "X", "X", "Z", "X", "Y","X", "X")
      )
    dt
    id log art
    1:  1  11   X
    2:  1  11   Y
    3:  2  11   X
    4:  3  12   X
    5:  3  12   X
    6:  4  12   Z
    7:  4  12   X
    8:  4  12   Y
    9:  5  13   X
    10: 5  13   X
    

    必需的输出:

     id    log  art    
      1     11   Y    
      2     11   Y
      3     12   Z,Y
      4     12   Z,Y
      5     13   X
    

3 个答案:

答案 0 :(得分:2)

这是一种方法,尽管可能有更有效的方法。

unique(dt[,.(id, log)])[dt[, .(art=if(.N == 1 | all(art == "X"))
                                      art[1] else toString(unique(art[art != "X"]))),
                           by=log], on="log"]

返回

   id log  art
1:  1  11    Y
2:  2  11    Y
3:  3  12 Z, Y
4:  4  12 Z, Y
5:  5  13    X

通过每个日志执行所需艺术值的左连接到唯一ID和日志对。这假设没有ID跨越两个日志,这是示例中的情况。

答案 1 :(得分:1)

我们可以尝试

dt[,  .(art = if(all(art=="X")) "X" else 
     toString(unique(art[art != "X"]))), .(id, logbld = log)]
#    id logbld  art
#1:  1     11    Y
#2:  2     11    X
#3:  3     12    X
#4:  4     12 Z, Y
#5:  5     13    X

答案 2 :(得分:0)

只是想通过 printf("%s", cards[*y]); 来尝试:

dplyr