我浏览了类似的帖子,我尝试了它们,但我仍然无法解决我的问题。
我有一个矢量列表,如下面的
li
如果精确向量是另一个向量的子集,我试图从列表y2
中删除向量。
例如,在我的情况下,我应该y
和x
作为结果并从列表中删除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)
}
答案 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