我有两个矩阵列表
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
答案 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)