Проверка того, содержит ли группа векторов какие-либо подмножества друг друга как можно быстрее - PullRequest
0 голосов
/ 01 ноября 2018

Мой код работает, но я использую вложенный цикл for, который не может быть лучшим способом сделать это. Есть ли более быстрый способ проверить, содержит ли список векторов какие-либо другие векторы, которые являются подмножествами другого? Например, у меня есть список векторов с именем «a» с произвольным числом векторов:

a = list()
a[[1]] = c(1, 2)
a[[2]] = c(2, 3, 5)
a[[3]] = c(1, 2, 4, 6)
a[[4]] = c(9, 4)

Я хочу проверить, является ли [[n]] подмножеством любого другого вектора в списке. Так что в моем примере только [[1]] является подмножеством [[3]]. Вот мой код.

for (i in 1:length(a)) {
  for (j in 1:length(a)) {
    if(all(a[[i]] %in% a[[j]]) && i != j) {
        #do stuff...
    }
  }
}

По сути, он спрашивает, содержит ли список повторяющиеся векторы. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 01 ноября 2018

Один из способов сделать это - использовать double sapply. Я не уверен, насколько это эффективно, так как это более или менее двойной цикл, просто меньше кода.

sapply(seq_along(a), function(x) any(sapply(a[-x], 
                                    function(y) all(a[[x]] %in% y))))

#[1]  TRUE FALSE FALSE FALSE

Это следует той же логике, что и ваша. Цикл по каждому элементу списка и поиск, является ли он подмножеством любого другого элемента списка. Возвращает логический вектор, указывающий, является ли это подмножеством или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...