Комбинации столбцов, которые удовлетворяют определенному условию в R - PullRequest
1 голос
/ 06 апреля 2020

Я довольно плохо знаком с R и буду признателен за любую помощь, которую получу. У меня есть следующая двоичная таблица:

example <- matrix(ncol=4,c(1,1,0,1,1,1,0,0,1,1,0,0,1,0,0,1,0,1,1,0))
colnames(example) <- c("c1","c2","c3","c4")
rownames(example) <- c("r1","r2","r3","r4","r5")

Я хотел бы получить все возможные комбинации столбцов, где все строки имеют "1". В этом примере я получу следующий вывод:

result = ((c1, c3), (c2, c1, c3), (c2, c1, c4), (c3, c1, c4), (c3, c1, c4, c2), (c4, c1))

Еще раз спасибо за помощь. Приветствия

1 Ответ

2 голосов
/ 08 апреля 2020

Это требует некоторой работы, но я подумал, что я это выброшу. Я знаю, что другие в 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)"
...