2017-07-26 286 views
2

我有charactervectorlist一個S:刪除重複的元素

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

而且我正在尋找一個function,對於出現比整個listvector一度以上(在任何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

回答

5

我們可以unlistlist,使用duplicated得到一個邏輯list並使用mapplysetdiffReduce替代提取基於邏輯索引

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

這裏my.list'的元素。

# 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,我們可以用function(x, y) unique(c(x, y))取代c和完成同樣的總產量。