感谢您对我以前的问题的回复。我有两个列表:list1和list2。我想知道list1的每个对象是否包含在list2的每个对象中。例如:
> list1
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
> list2
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3
[[3]]
[1] 2 3
以下是我的问题:
1.)我如何要求R检查对象是否是列表中另一个对象的子集?
例如,我想检查list2[[3]]={2,3}
是否包含在list1[[2]]={2}
的(子集)中。当我list2[[3]] %in% list1[[2]]
时,我得到[1] TRUE FALSE
。但是,这不是我想做的事情?!我只想检查list2[[3]]
是否是list1[[2]]
的子集,即{3}的{2,3} \子集,如集合理论概念?我不想执行元素检查,因为R似乎正在使用%in%命令。有什么建议吗?
2。)对于所有list1[[i]]
组合,是否有某种方法可以有效地进行所有成对子集比较(即list2[[j]]
i,j
的子集?类似于{{1}一旦问题1被回答,工作?
感谢您的反馈!
答案 0 :(得分:5)
setdiff
比较唯一值
length(setdiff(5, 1:5)) == 0
或者,all(x %in% y)
可以很好地运作。
要进行所有比较,这样的事情会起作用:
dt <- expand.grid(list1,list2)
dt$subset <- apply(dt,1, function(.v) all(.v[[1]] %in% .v[[2]]) )
Var1 Var2 subset
1 1 1, 2, 3 TRUE
2 2 1, 2, 3 TRUE
3 3 1, 2, 3 TRUE
4 1 2, 3 FALSE
5 2 2, 3 TRUE
6 3 2, 3 TRUE
7 1 2, 3 FALSE
8 2 2, 3 TRUE
9 3 2, 3 TRUE
请注意expand.grid
在处理大量数据时不是最快的方法(dwin的解决方案在这方面更好),但它允许您快速检查这是否正在做你做的事情想。
答案 1 :(得分:2)
您可以按如下方式使用sets
包:
library(sets)
is.subset <- function(x, y) as.set(x) <= as.set(y)
outer(list1, list2, Vectorize(is.subset))
# [,1] [,2] [,3]
# [1,] TRUE FALSE FALSE
# [2,] TRUE TRUE TRUE
# [3,] TRUE TRUE TRUE
@Michael或@Ddin的is.subset
基础版本也可以正常工作,但对于你的问题的第二部分,我认为outer
是可行的方法。
答案 2 :(得分:1)
is.subset <- function(x,y) {length(setdiff(x,y)) == 0}
首先是list1元素的组合,它们是list2项的子集:
> sapply(1:length(list1), function(i1) sapply(1:length(list2),
function(i2) is.subset(list1[[i1]], list2[[i2]]) ) )
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] FALSE TRUE TRUE
[3,] FALSE TRUE TRUE
然后毫无疑问缺少任何list2项(全部长度> 1)是列表一项(全长为1)的子集:
> sapply(1:length(list1), function(i1) sapply(1:length(list2),
function(i2) is.subset(list2[[i2]], list1[[i1]]) ) )
[,1] [,2] [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE
答案 3 :(得分:0)
添加到@ Michael,这是使用AsIs函数避免expand.grid混乱的一种巧妙方法:
list2 <- list(1:3,2:3,2:3)
a <- data.frame(list1 = 1:3, I(list2))
a$subset <- apply(a, 1, function(.v) all(.v[[1]] %in% .v[[2]]) )
list1 list2 subset
1 1 1, 2, 3 TRUE
2 2 2, 3 TRUE
3 3 2, 3 TRUE