【问题标题】:Remove duplicated elements from list从列表中删除重复的元素
【发布时间】:2018-01-01 05:59:41
【问题描述】:

我有一个list character vectors:

my.list <- list(e1 = c("a","b","c","k"),e2 = c("b","d","e"),e3 = c("t","d","g","a","f"))

我正在寻找一个function,对于在list 的vectors 中出现不止一次的任何character(在每个vector 中,character 只能出现一次) , 只会保留第一次出现。

因此,此示例的结果列表为:

res.list <- list(e1 = c("a","b","c","k"),e2 = c("d","e"),e3 = c("t","g","f"))

请注意,list 中的整个 vector 可能会被删除,因此生成的 list 中的元素数不一定必须等于输入 list。

【问题讨论】:

    标签: r list redundancy


    【解决方案1】:

    我们可以unlistlist,使用duplicated得到一个逻辑list,并根据逻辑索引提取'my.list'中的元素

    un <- unlist(my.list)
    res <- Map(`[`, my.list, relist(!duplicated(un), skeleton = my.list))
    identical(res, res.list)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      这里是使用mapply 与setdiff 和Reduce 的替代方法。

      # make a copy of my.list
      res.list <- my.list
      # take set difference between contents of list elements and accumulated elements
      res.list[-1] <- mapply("setdiff", res.list[-1],
                                        head(Reduce(c, my.list, accumulate=TRUE), -1))
      

      保留列表的第一个元素,我们计算后续元素以及由Reduce 使用c 和accumulate=TRUE 参数生成的元素的累积向量列表。 head(..., -1) 删除包含所有元素的最终列表项,以便长度对齐。

      返回

      res.list
      $e1
      [1] "a" "b" "c" "k"
      
      $e2
      [1] "d" "e"
      
      $e3
      [1] "t" "g" "f"
      

      请注意,在Reduce 中,我们可以将c 替换为function(x, y) unique(c(x, y)) 并完成相同的最终输出。

      【讨论】:

        【解决方案3】:

        我发现这里的解决方案对于我的理解来说非常复杂,并寻求一种更简单的技术。假设您有以下列表。

        my_list <- list(a = c(1,2,3,4,5,5), b = c(1,2,2,3,3,4,4), 
                        
                        d = c("Mary", "Mary", "John", "John"))
        

        下面更简单的一段代码删除了重复项。

        sapply(my_list, unique)
        

        你会得到以下结果。

        $a
        [1] 1 2 3 4 5
        
        $b
        [1] 1 2 3 4
        
        $d
        [1] "Mary" "John"
        

        简单中有美!

        【讨论】:

          猜你喜欢
          • 2015-01-05
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多