从列表中删除所有子集

时间:2017-08-29 05:42:54

标签: r list subset

我有一个如下所示的列表:

a <- c(1, 3, 4)
b <- c(0, 2, 6)
c <- c(3, 4)
d <- c(0, 2, 6)
list(a, b, c, d)

从这个列表中我想删除所有子集,使列表如下所示:

[[1]]
[1] 1 3 4

[[2]]
[1] 0 2 6

我该怎么做?在我的实际数据中,我正在处理一个非常长的列表(&gt; 500k元素),因此欢迎任何有效实施的建议。

2 个答案:

答案 0 :(得分:2)

这是一种方法。

tf1.addMouseListener(new MouseListener() {
    @Override
    public void mouseClicked(MouseEvent e) {
    tf1.setText("");
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {
    if(tf1.getText().equals("KG here") || tf1.getText().isEmpty())
        tf1.setText("KG here");
    }
});

首先,删除所有重复项。

lst <- list(a, b, c, d)  # The list

如果列表仍包含多个元素,我们按其元素的长度(减少)对列表进行排序。

lstu <- unique(lst)

然后可以使用以下命令过滤子集:

lstuo <- lstu[order(-lengths(lstu))]

结果:

lstuo[c(TRUE, !sapply(2:length(lstuo),
                      function(x) any(sapply(seq_along(lstuo)[-x], 
                                             function(y) all(lstuo[[x]] %in% lstu[[y]])))))]

答案 1 :(得分:1)

替代方法

您的数据

lst <- list(a, b, c, d)  # The list
lstu <- unique(lst)        # remove duplicates, piggyback Sven's approach

制作数值矩阵和索引

m <- combn(lstu, 2)           # 2-row matrix of non-self pairwise combinations of values
n <- combn(length(lstu), 2)   # 2-row matrix of non-self pairwise combination of index

确定子集

issubset <- t(sapply(list(c(1,2),c(2,1)), function(z) mapply(function(x,y) all(x %in% y), m[z[1],], m[z[2],])))

放弃列表中的子集向量

discard <- c(n*issubset)[c(n*issubset)>0]
ans <- lstu[-discard]

<强>输出

[[1]]
[1] 1 3 4

[[2]]
[1] 0 2 6