Как насчет следующего
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