我有一个列表,其中包含几个不同长度的元素。
mylist <- list(one=c("A","B","B"), two=c("A","A","B"), three=c("X","X","Y"))
我希望选择具有一组特定值的元素,例如元素one
和two
,两者都具有唯一值"A","B"
。
我试过了
cond <- sapply(mylist, function(x) unique(x)==c("A","B"))
mylist[cond]
但这似乎不起作用。
答案 0 :(得分:3)
我希望我能正确理解你需要的东西。如果是这样,这将做:
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
功能,您还可以返回值的子集。
如果您不喜欢索引,也可以使用简单的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
语句中添加了第二个条件。现在它将丢弃唯一值包含除您正在寻找的其他元素之外的其他元素的情况。
答案 1 :(得分:1)
另一个想法是使用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"
,
<p class="smallText">{{vehicleItem.registration}}, {{vehicleItem.colour}} {{vehicleItem.make}} {{vehicleItem.model}}</p>