从列表中删除重复的元素

时间:2017-07-26 05:18:56

标签: r list redundancy

我有list character vector s:

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

我正在寻找function character list vector vector character res.list <- list(e1 = c("a","b","c","k"),e2 = c("d","e"),e3 = c("t","g","f")) vector list list list } !只能出现一次),只保留第一次出现。

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

0

请注意,1中的整个$num = 1; // it always is either 0 or 1 function toggleNumber($num) { return !$num; } $num = intval(toggleNumber($num)); echo $num; //print 0 echo "<br>"; $num = intval(toggleNumber($num)); echo $num; // print 1 可能会被删除,因此生成的$num = intval(!($num));中的元素数量不一定等于输入{{1}}。

3 个答案:

答案 0 :(得分:7)

我们可unlist list,使用list获取逻辑duplicated并根据逻辑索引提取'my.list'中的元素

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

答案 1 :(得分:2)

以下是使用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使用caccumulate=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))并完成相同的最终输出。

答案 2 :(得分:0)

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

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"

简单中有美!