R: сумма элементов в матрице до порога - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть матрица значений с тысячами строк и несколькими десятками столбцов. Для данной строки, $$ R_0 $$, я хотел бы найти все остальные дополнительные строки. Дополнительная строка определяется как:

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

Для иллюстрации приведу игрушечную матрицу:

     [,1]     [,2]      [,3]      [,4]      [,5]      [,6]
[1,] 0         0        0         0.1816416 0         0.1796779
[2,] 0.1889351 0        0         0         0         0        
[3,] 0         0        0.1539683 0         0         0.1983812
[4,] 0         0.155489 0.1869410 0         0         0        
[5,] 0         0        0         0         0.1739382 0        

Для строки 1 имеются значения для столбцов 4 и 6. Дополнительная строка должна иметь «0» для столбцов 4 и 6.

Я не знаю, какой структурой данных должен быть мой желаемый вывод. Но я знаю, что вывод должен сказать мне:

  • строка 1 имеет следующие дополнительные строки: 2, 3, 5
  • строка 2 имеет следующие дополнительные строки: 1, 3, 4, 5
  • строка 3 имеет следующие дополнительные строки: 2, 5
  • строка 4 имеет следующие дополнительные строки: 1, 2, 5
  • строка 5 имеет следующие дополнительные строки: 1, 2, 3, 4

Возможно, список списков? I.e.:

[1: 2, 3, 5;
 2: 1, 3, 4, 5;
 3: 2, 5;
 4: 1, 2, 5;
 5: 1, 2, 3, 4]

Но я открыт для других структур данных.

Следующий код генерирует игрушечную матрицу выше.

set.seed(1)
a = runif(n=30, min=0, max=0.2)
a[a<0.15] = 0
A = matrix(a,              # the data elements 
           nrow=5,         # number of rows 
           ncol=6,         # number of columns 
           byrow = TRUE)   # fill matrix by rows

Есть ли какой-то пакет или умный способ решить эту проблему?

1 Ответ

2 голосов
/ 03 апреля 2019

Мы можем создать функцию, чтобы проверить, является ли комбинация двух строк комплиментом

check_compliment <- function(x, y) {
  all(A[y, A[x,] != 0] == 0) & sum(c(A[x, ], A[y, ])) < 1
}

Здесь мы подставляем строку y для столбцов, где x не равно 0, и проверяем, равны ли all из них 0. Также проверяем, меньше ли sum из x и y строк меньше 1 .

Применить эту функцию для каждой комбинации, используя outer

sapply(data.frame(outer(1:nrow(A), 1:nrow(A), Vectorize(check_compliment))), which)

#$X1
#[1] 2 4 5

#$X2
#[1] 1 3 4 5

#$X3
#[1] 2 5

#$X4
#[1] 1 2 5

#$X5
#[1] 1 2 3 4

outer шаг дает нам значение TRUE / FALSE для каждой комбинации строки с каждой другой строкой, указывающей, является ли это комплиментом

outer(1:nrow(A), 1:nrow(A), Vectorize(check_compliment))
#      [,1]  [,2]  [,3]  [,4]  [,5]
#[1,] FALSE  TRUE FALSE  TRUE  TRUE
#[2,]  TRUE FALSE  TRUE  TRUE  TRUE
#[3,] FALSE  TRUE FALSE FALSE  TRUE
#[4,]  TRUE  TRUE FALSE FALSE  TRUE
#[5,]  TRUE  TRUE  TRUE  TRUE FALSE

Мы конвертируем это в фрейм данных и используем which для получения индексов для каждого столбца.

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