将 unique() 应用于列表中的每个元素

Applying unique() to each element in list

我有一个包含多个不同长度元素的列表。

mylist <- list(one=c("A","B","B"), two=c("A","A","B"), three=c("X","X","Y"))

并且我想要 select 具有一组特定唯一值的元素,例如元素 onetwo,它们都具有唯一值 "A","B"

我试过了

cond <- sapply(mylist, function(x) unique(x)==c("A","B"))
mylist[cond]

但这似乎不起作用。

希望我正确理解了您的需求。如果是这样,这将做:

mylist2 <- lapply(mylist,function(x) x[all(c("A","B") %in% unique(x))])

mylist2 <- lapply(mylist,function(x) x[all(c("A","B") == unique(x))])

这些基本相同,如果您删除 all 函数,您还可以 return 值的子集。

如果您不喜欢索引,您也可以使用简单的 if 条件(或在需要时使用 ifelse):

lapply(mylist,function(x) if(all(c("A","B") == unique(x))) x)

mylist2 <- lapply(mylist,function(x) if(all(c("A","B") %in% unique(x))) x)

编辑:

根据您最后的评论,我认为这个强大的解决方案最适合您数据中可能出现的变化:

mylist <- list(one=c("A","B","B"), two=c("A","A","B"), three=c("X","X","Y"),four=c("A","B","X"))

mylist2 <- lapply(mylist,function(x) if(all(unique(x) %in% c("A","B")) & all(c("A","B") %in% unique(x))) x)

我放弃了 == 版本,因为它们无法处理不同数量的元素进行比较。我还向 if 语句添加了第二个条件。现在它将丢弃唯一值包含您要查找的元素以外的其他元素的情况。

另一个想法是使用 setdiff,

Filter(length, lapply(mylist, function(i) i[length(setdiff(unique(i), c('A', 'B'))) == 0]))
#$one
#[1] "A" "B" "B"

#$two
#[1] "A" "A" "B"