Проверьте, равны ли какие-либо комбинации столбцов некоторому определенному значению в матрице. - PullRequest
0 голосов
/ 08 ноября 2019

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

Мы использовали только 0 и 1. Как для true и false

Так, например, из этого кода ниже будут столбцы 2 и 6, которые создают 1,1,1,1

Некоторый код:

A <- matrix(c(0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,1),4,6)
A

print("Combination of expected result ")

B <- matrix(c(1,1,1,1),4,1)
B

ожидаемый результат, которого я хотел бы достичь, для этого примера 2, 6, что означает, что столбцы 2 и 6 вместе могут объединять 1,1,1,1

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Это выглядит немного перегруженным (используя combn() дважды), но делает свою работу.

i1 <- combn(seq(6), 2, FUN = function(i)rowSums(A[,i]) > 0)
combn(seq(6), 2)[,colSums(i1) == nrow(i1)]
#[1] 2 6
1 голос
/ 08 ноября 2019

Мы можем создать комбинацию всех столбцов, взятых по 2 за раз, подставить их из A и сравнить с B, если все значения совпадают, мы возвращаем индекс этого столбца или возвращаем NA.

out <- combn(seq(ncol(A)), 2, function(x) 
          if(all(pmax(A[, x[1]], A[, x[2]]) == B)) toString(x) else NA, )
out[!is.na(out)]
#[1] "2, 6"

В настоящее время выходные данные возвращают строку, разделенную запятыми, в зависимости от того, как вы хотите получить конечный результат, вы можете изменить это. Возможно, используйте simplify = FALSE, чтобы получить список.

0 голосов
/ 08 ноября 2019

Если вы хотите получить все комбинации столбцов (выберите любое количество столбцов, т. Е. От 1 до ncol(A)), которые соответствуют вашей цели, вы можете использовать следующее решение:

r <- Filter(nchar,unlist(sapply(seq(ncol(A)), function(k) combn(seq(ncol(A)),k, function(x) ifelse(all(as.numeric(rowSums(as.matrix(A[,x]))>=1)==B), toString(x), NA)))))

тогда вы получите

> r
 [1] "2, 6"             "1, 2, 6"          "2, 3, 6"          "2, 4, 6"          "2, 5, 6"          "1, 2, 3, 6"       "1, 2, 4, 6"       "1, 2, 5, 6"       "2, 3, 4, 6"      
[10] "2, 3, 5, 6"       "2, 4, 5, 6"       "1, 2, 3, 4, 6"    "1, 2, 3, 5, 6"    "1, 2, 4, 5, 6"    "2, 3, 4, 5, 6"    "1, 2, 3, 4, 5, 6"

Надеюсь, что это может помочь!

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