Это требует некоторой работы, но я подумал, что я это выброшу. Я знаю, что другие в SO могут улучшить это (значительно, я мог бы добавить). Я был бы очень открыт для комментариев и улучшения этого ответа, если смогу.
Сначала я получил бы все комбинации имен столбцов различной длины (от 1 до 4 столбцов) и поместил их в список.
lst <- do.call(c, lapply(seq_along(colnames(example)), combn, x = colnames(example), simplify = FALSE))
Во-вторых, go пройдет через этот список и создаст матрицы для этих выбранных столбцов.
lst2 <- lapply(lst, function(x) matrix(example[,x], ncol = length(x)))
В-третьих, назовет список на основе имен столбцов и удалит кавычки.
names(lst2) <- gsub('[\"]', '', lst)
В-четвертых, будет проверяться каждая матрица в списке, где (a) любой столбец в строке имеет 1, и (b) все строки соответствуют критериям (a).
names(which(lapply(lst2, function(x) { all(apply(x, 1, function(y) any(y > 0))) } ) == TRUE))
Выход
[1] "c(c1, c3)" "c(c1, c4)" "c(c1, c2, c3)" "c(c1, c2, c4)" "c(c1, c3, c4)"
[6] "c(c1, c2, c3, c4)"