如何检查精确向量是否是列表中另一个向量的子集

Est*_*lva 4 r subset

我浏览了类似的帖子并尝试了它们,但仍然无法解决我的问题。

我有一个向量列表,如下所示

y2 <- c(0,0,NA,0,0,0,0)
y <- c(0,0,0,NA,NA,0)
x <- c(0,0,0,0)
li <-list(y2,y,x)
Run Code Online (Sandbox Code Playgroud)

li如果确切的向量是另一个向量的子集,我正在尝试从列表中删除该向量。

例如,在我的情况下,我应该有y2y结果并x从列表中删除,因为它xy2.

我编写了以下脚本,但它只给出了 y2 作为结果,而忽略了y

UniquePath <- function(PATHS)
{
  for(j in length(PATHS):1)
  {
    for(i in 1:length(PATHS))
    {
      if((i!=j)&(isTRUE(all(is.element(PATHS[[j]],PATHS[[i]])))))
      {
        PATHS<-PATHS[-j]
        break
      }
      else
      {
        next
      }
    }
  }
  return(PATHS)
}
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 5

我的方法是(假设您的字符串中没有“;”)

# make li unique
li <- unique(li)
# collapse each unique list element to a length-1 string surrounded by ";" 
x <- sapply(li, function(x) paste0(";", paste(x, collapse = ";"), ";"))
# check each element, if this is found somewhere in any other element
li[sapply(seq_along(x), function(i) !any(grepl(x[i], x[-i], fixed = TRUE)))]
# [[1]]
# [1]  0  0 NA  0  0  0  0
# 
# [[2]]
# [1]  0  0  0 NA NA  0
Run Code Online (Sandbox Code Playgroud)

但是,OP 似乎应该构成一个更大的示例,并澄清在对其他答案的评论中提出的一些问题。

注意:在这个答案中,我将 x 定义为 y 的子集,当且仅当 x 的确切序列存在于 y 中且中间没有任何其他元素时。我就是这样理解这个问题的。