Фильтр вложенного списка матрицы по имени строки

#r #list #matrix #filter #subset

Вопрос:

У меня есть список матриц, который был создан на веб-сайте. Я хочу отфильтровать каждую матрицу по имени строки и столбца. Я могу фильтровать матрицу по именам строк и спискам, но не по матрице в списке!

Некоторые данные

 set.seed(1)  a_matrix lt;- matrix(sample(0:100, 16), ncol=4) b_matrix lt;- matrix(sample(0:100, 16), ncol=4) dimnames(a_matrix) lt;- list(rownames(a_matrix, do.NULL = FALSE, prefix = "row"),  colnames(a_matrix, do.NULL = FALSE, prefix = "col"))  dimnames(b_matrix) lt;- list(rownames(b_matrix, do.NULL = FALSE, prefix = "row"),  colnames(b_matrix, do.NULL = FALSE, prefix = "col")) a_matrix  col1 col2 col3 col4 row1 26 19 58 61 row2 37 86 5 33 row3 56 97 18 66 row4 89 62 15 42  b_matrix  col1 col2 col3 col4 row1 13 21 86 12 row2 1 77 93 39 row3 44 64 74 47 row4 17 69 80 22  my_list lt;- list(a_matrix,b_matrix)   Filtering the whole list by:   names lt;- c("col1", "col2", "row2", "row3")  

Идеальный Результат

 a_matrix  col1 col2  row2 37 86  row3 56 97    b_matrix  col1 col2  row2 1 77  row3 44 64   

При этом все еще оставаясь в списке.

Комментарии:

1. Попробуй lapply(my_list, (x) x[names[3:4], names[1:2]])

2. Ваш код не работает, что это rmatrix такое ? И всегда используйте set.seed() , когда задействованы случайные процессы, чтобы сделать результаты воспроизводимыми.

Ответ №1:

Повторите цикл list с lapply , подмножество матрицы с именами строк/столбцов из names вектора, где элементы от 3 до 4 являются атрибутом имен строк, а от 1 до 2-именами столбцов

 lapply(my_list, (x) x[names[3:4], names[1:2]])  

-выход

 [[1]]  col1 col2 row2 37 86 row3 56 97  [[2]]  col1 col2 row2 1 77 row3 44 64  

данные

 my_list lt;- list(structure(c(26L, 37L, 56L, 89L, 19L, 86L, 97L, 62L, 58L,  5L, 18L, 15L, 61L, 33L, 66L, 42L), .Dim = c(4L, 4L), .Dimnames = list(  c("row1", "row2", "row3", "row4"), c("col1", "col2", "col3",   "col4"))), structure(c(13L, 1L, 44L, 17L, 21L, 77L, 64L,  69L, 86L, 93L, 74L, 80L, 12L, 39L, 47L, 22L), .Dim = c(4L, 4L ), .Dimnames = list(c("row1", "row2", "row3", "row4"), c("col1",  "col2", "col3", "col4"))))  

Комментарии:

1. Спасибо, не совсем понимаю [3:4] и [1:2] элементы кода, но он работал так, как я хотел!

2. @TDaw просто вы создали names вектор с именами строк в позициях 3 и 4, тогда как имена столбцов находятся в 1 и 2 позициях в векторе

3. Еще раз спасибо! Теперь я понимаю