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

使用R中的Data.Table实现两个列表的行差异

  •  0
  • watchtower  · 技术社区  · 8 年前

    我想用 data.table 为了递增地找出新元素,即对于每一行,我要查看列表中的值以前是否见过。如果他们是,我们将忽略他们。如果没有,我们将选择他们。

    我能够将元素按组包装在一个列表中,但我不确定如何找到增量差异。

           df = data.table::data.table(id = c('A','B','C','A','B','A','A','A','D','E','E','E'), 
    Value = c(1,2,3,4,3,5,2,3,7,2,3,9))
    
           df_wrapped=df[,.(Values=(list(unique(Value)))), by=id]
    
           expected_output = data.table::data.table(id = c("A","B","C","D","E"),
    Value = list(c(1,4,5,2,3),c(2,3),c(3),c(7),c(2,3,9)),
    Diff=list(c(1,4,5,2,3),c(NA),c(NA),c(7),c(9)),
    Count = c(5,0,0,1,1))
    

    关于预期产出的思考:

    • Diff 列。
    • 2,3 发生在第1行。因此,我们将忽略它们。第3行同上。
    • 同样地, 7 和 9 第一次出现在第4行和第5行中,因此我们将包括它们。

    以下是视觉表现:

    expected_output
       id     Value      Diff Count
        A 1,4,5,2,3 1,4,5,2,3     5
        B       2,3        NA     0
        C         3        NA     0
        D         7         7     1
        E     2,3,9         9     1
    

    如果有任何想法,我将不胜感激。我只是在找 数据表 因为我的原始数据集中存在性能问题,所以需要基于的解决方案。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Hjalmar    8 年前

    我不知道你为什么特别需要把它们列在一个列表中,但我写了一个小文章,可以帮助你。

    df = data.table::data.table(id = c('A','B','C','A','B','A','A','A','D','E','E','E'), 
                                Value = c(1,2,3,4,3,5,2,3,7,2,3,9))
    
    df = df[order(id, Value)]
    df = df[duplicated(Value) == FALSE, diff := Value][]
    df = df[, count := uniqueN(diff, na.rm = TRUE), by = id]
    

    结果将是:

    > df
        id Value diff count
     1:  A     1    1     5
     2:  A     2    2     5
     3:  A     3    3     5
     4:  A     4    4     5
     5:  A     5    5     5
     6:  B     2   NA     0
     7:  B     3   NA     0
     8:  C     3   NA     0
     9:  D     7    7     1
    10:  E     2   NA     1
    11:  E     3   NA     1
    12:  E     9    9     1
    

    希望这对你有帮助,或者至少让你开始。

        2
  •  1
  •   chinsoon12    8 年前

    library(data.table)
    df = data.table(
        id = c('A','B','C','A','B','A','A','A','D','E','E','E'), 
        Value = c(1,2,3,4,3,5,2,3,7,2,3,9))
    
    valset <- c()
    df[, {
            d <- setdiff(Value, valset)
            valset <- unique(c(valset, Value))
            .(Values=.(Value), Diff=.(d), Count=length(d))
        }, 
        by=.(id)]
    

       id    Values      Diff Count
    1:  A 1,4,5,2,3 1,4,5,2,3     5
    2:  B       2,3               0
    3:  C         3               0
    4:  D         7         7     1
    5:  E     2,3,9         9     1