从列表中删除出现在R中另一个子元素列表中的子元素

时间:2018-07-03 00:48:09

标签: r list

我有两个矩阵列表

lst1 <- lapply(1:4, function(i) combn(x=4,m=i))
lst2 <- lapply(1:5, function(i) combn(x=5,m=i))

,并希望提取第二个列表中矩阵的列,而不是第一个列表中矩阵的列。你能帮忙吗?

例如

我想在下面获得此列表

[[1]]
     [,5]
[1,]    5

[[2]]
     [,4] [,7] [,9] [,10]
[1,]    1    2    3     4
[2,]    5    5    5     5

[[3]]
    [,3] [,5] [,6] [,8] [,9] [,10]
[1,]   1    1    1    2    2     3
[2,]   2    3    4    3    4     4
[3,]   5    5    5    5    5     5

[[4]]
    [,2] [,3] [,4] [,5]
[1,]   1    1    1    2
[2,]   2    2    3    3
[3,]   3    4    4    4
[4,]   5    5    5    5

[[5]]
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
[5,]    5

4 个答案:

答案 0 :(得分:0)

以下内容

lapply(lst2, function(x) Filter(Negate(is.null), lapply(lst1, function(y)
    if (nrow(x) == nrow(y)) x[, !apply(x, 2, toString) %in% apply(y, 2, toString)])))
#[[1]]
#[[1]][[1]]
#[1] 5
#
#
#[[2]]
#[[2]][[1]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    5    5    5    5
#
#
#[[3]]
#[[3]][[1]]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    2    2    3
#[2,]    2    3    4    3    4    4
#[3,]    5    5    5    5    5    5
#
#
#[[4]]
#[[4]][[1]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    1    2
#[2,]    2    2    3    3
#[3,]    3    4    4    4
#[4,]    5    5    5    5
#
#
#[[5]]
#list()

对于lst2中的每个条目,我们检查lst1中所有条目的唯一列。因此,输出list的长度等于lst2的长度,这使得从lst2识别没有唯一列且没有lst1条目的条目变得容易(如lst2的第五个条目就是这种情况。


更新

要准确地复制您的预期输出,您可以做的

lst <- lapply(lst2, function(x) Filter(Negate(is.null), lapply(lst1, function(y)
    if (nrow(x) == nrow(y)) x[, !apply(x, 2, toString) %in% apply(y, 2, toString)])))

lst <- unlist(lapply(seq_along(lst), function(i)
    if (length(lst[[i]]) == 0) lst[[i]] <- list(lst2[[i]]) else lst[[i]]), recursive = F)
lst;
#[[1]]
#[1] 5
#
#[[2]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    5    5    5    5
#
#[[3]]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    2    2    3
#[2,]    2    3    4    3    4    4
#[3,]    5    5    5    5    5    5
#
#[[4]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    1    2
#[2,]    2    2    3    3
#[3,]    3    4    4    4
#[4,]    5    5    5    5
#
#[[5]]
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

答案 1 :(得分:0)

使用基本R:

Map(function(x,y)as.matrix(unname(setdiff(data.frame(y),data.frame(x)))),c(lst1,NA),lst2) 

[[1]]
  [,1]
1    5

[[2]]
  [,1] [,2] [,3] [,4]
1    1    2    3    4
2    5    5    5    5

[[3]]
  [,1] [,2] [,3] [,4] [,5] [,6]
1    1    1    1    2    2    3
2    2    3    4    3    4    4
3    5    5    5    5    5    5

[[4]]
  [,1] [,2] [,3] [,4]
1    1    1    1    2
2    2    2    3    3
3    3    4    4    4
4    5    5    5    5

[[5]]
  [,1]
1    1
2    2
3    3
4    4
5    5

或者您可以

purrr::map2(c(lst1,NA),lst2,~as.matrix(unname(setdiff(data.frame(.y),data.frame(.x)))))

[[1]]
     [,1]
[1,]    5

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    5    5    5

[[3]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    3    4    3    4    4
[3,]    5    5    5    5    5    5

[[4]]
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    2
[2,]    2    2    3    3
[3,]    3    4    4    4
[4,]    5    5    5    5

[[5]]
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
[5,]    5

答案 2 :(得分:0)

这是另一个base R选项

fpaste <- function(x) tapply(x, col(x), toString)
fun1 <- Vectorize(function(x, y) x[,!fpaste(x) %in% fpaste(y), drop = FALSE])
m1 <- outer(lst2, lst1, FUN = fun1)
c(diag(m1), m1[length(m1)])
#[[1]]
#     [,1]
#[1,]    5

#[[2]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    5    5    5    5

#[[3]]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    2    2    3
#[2,]    2    3    4    3    4    4
#[3,]    5    5    5    5    5    5

#[[4]]
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    1    2
#[2,]    2    2    3    3
#[3,]    3    4    4    4
#[4,]    5    5    5    5

#[[5]]
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

答案 3 :(得分:0)

这应该有效:

foo  <-  function(z,w) w[,!apply(matrix(apply(w,2,function(y) apply(z, 2, 
function(x) identical(x, y))), nrow=ncol(z)),2,any)]

mapply(foo, lst1,lst2)