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

时间:2017-12-05 11:32:42

标签: r subset

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

我有一个矢量列表,如下面的

li

如果精确向量是另一个向量的子集,我试图从列表y2中删除向量。

例如,在我的情况下,我应该yx作为结果并从列表中删除x,因为y2是{{1}的确切子集}}。

我编写了以下脚本,但它只是将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)
}

3 个答案:

答案 0 :(得分:4)

我的方法是(假设你的字符串中没有&#34 ;;&#34;)

# 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

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

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

答案 1 :(得分:0)

我认为这可能就是你要找的东西。

$grid-columns:      24;
$grid-gutter-width: 12px;

@import "bootstrap";

一些例子:

uniquePath <- function(l){
  idxs <- 1:length(l)
  tmp <- lapply(l, table, useNA='always')
  l2 <- lapply(idxs, function(i){
    res <- l[[i]]
    for(j in idxs[-i]){
      if ( all(res %in% l[[j]]) & all(tmp[[i]] <= tmp[[j]])){ 
        res <- NULL; break 
      }
    }
    res
  })
  Filter(Negate(is.null), l2)
}

答案 2 :(得分:0)

使用递归函数如何进行以下操作。

# Your sample data
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 = y2,y = y,x = x)

我定义了递归函数collapseList,如果它们是其他列表条目的有序子集,则递归删除列表条目。

# Recursive function to collapse entries
collapseList <- function(lst) {
    s <- sapply(lst, paste, collapse = "");
    if (sum(grepl(s[1], s)) > 1) {
        lst <- lst[-1];
        collapseList(lst);
    }
    else lst;
}

根据您的样本列表输出:

# Order list by number of list elements
li <- li[order(sapply(li, length))];

li <- collapseList(li);
li;
#$y
#[1]  0  0  0 NA NA  0
#
#$y2
#[1]  0  0 NA  0  0  0  0

@storaged示例

li <- list(
    x = c(0,0,0,0), 
    y = c(0,NA,0,0,0), 
    y2 = c(NA,NA,0,0,0,0));

li <- li[order(sapply(li, length))];
collapseList(li);
#$y
#[1]  0 NA  0  0  0
#
#$y2
#[1] NA NA  0  0  0  0