从列表中删除重复元素

12

我有一个字符向量列表

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

我正在寻找一个函数,对于出现在listvector中多次的任何character(在每个vector中,一个character只能出现一次),将仅保留第一次出现。

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

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

请注意,可能会消除列表中的整个向量,因此生成的列表中的元素数量不一定等于输入列表。在结果列表中保留HTML标签。
3个回答

15

我们可以使用 unlist 函数将列表展开,使用 duplicated 函数获取逻辑 list,然后根据该逻辑索引从 'my.list' 中提取元素。

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

4

以下是使用mapplysetdiffReduce的另一种替代方案。

# 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和accumulate=TRUE参数产生元素的累积向量列表 c ,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,并实现相同的最终输出。

1
我发现这里的解决方案对我来说非常复杂,因此寻求了一种更简单的技术。假设您有以下列表。
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"

简单之美!


2
这不是OP所要求的。 - KarthikS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接