检查列表是否包含R中的另一个列表

gen*_*ted 7 r list subset

我想检查一个列表(或一个矢量,等价)是否包含在另一个列表中,而不是它是否是它的子集.让我们假设我们有

r <- c(1,1)
s <- c(5,2)
t <- c(1,2,5)
Run Code Online (Sandbox Code Playgroud)

该函数应该表现如下:

is.contained(r,t) 
[1] FALSE
# as (1,1) is not contained in (1,2,5) since the former 
# contains two 1 whereas the latter only one.

is.contained(s,t)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

操作员%in%检查子集,因此TRUE在两种情况下都会返回,同样allany.我确信有一个单行,但我只是没有看到它.

Sim*_*son 0

length()另一个自定义函数版本,检查不相等元素 ( ) 的元素数量 ( setdiff) 是否等于向量长度之差:

# Does vector x contain vector y?
is.contained <- function(x, y) {
  z <- x[x %in%setdiff(x, y)]
  length(z) == length(x) - length(y)
}

r <- c(1,1)
s <- c(1,1,5)
t <- c(1,2,5)

is.contained(r, t)
#> [1] FALSE
is.contained(s, r)
#> [1] TRUE
is.contained(r, s)
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud)

  • 上面实际上有一个错误:对于 `t &lt;- c(1,1,5), s &lt;- c(2,5)` 函数返回 TRUE,而它应该返回 FALSE。仍然是因为 `setdiff` 的基数被计为 1。 (2认同)