将 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 具有一组特定唯一值的元素,例如元素 one
和 two
,它们都具有唯一值 "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"
我有一个包含多个不同长度元素的列表。
mylist <- list(one=c("A","B","B"), two=c("A","A","B"), three=c("X","X","Y"))
并且我想要 select 具有一组特定唯一值的元素,例如元素 one
和 two
,它们都具有唯一值 "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"