我浏览了类似的帖子并尝试了它们,但仍然无法解决我的问题。
我有一个向量列表,如下所示
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如果确切的向量是另一个向量的子集,我正在尝试从列表中删除该向量。
例如,在我的情况下,我应该有y2和y结果并x从列表中删除,因为它x是y2.
我编写了以下脚本,但它只给出了 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)
我的方法是(假设您的字符串中没有“;”)
# 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 中且中间没有任何其他元素时。我就是这样理解这个问题的。