Выберите столбец из списка матриц, используя список векторов - PullRequest
2 голосов
/ 15 апреля 2019

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

Я пробовал разные комбинации map и (s|l)apply, даже классические циклы for, но мне не удалось выбрать столбцы.

С помощью этого кода вы можете сгенерировать список матриц и булевых векторов для эксперимента:

matrices <- list(matrix(c(7,8,9,10), nrow=1), matrix(c(7,8,7,9,7,10,8,9,8,10,9,10), nrow=2), matrix(c(7,8,9,7,8,10,7,9,10,8,9,10), nrow=3))
listOfColumns <- list(c(FALSE,FALSE,FALSE,FALSE), c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE), c(TRUE,FALSE,FALSE,FALSE))

В качестве примера, имея список матриц, созданных с помощью вышеуказанного кода:

[[1]]
     [,1] [,2] [,3] [,4]
[1,]    7    8    9   10

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    7    7    7    8    8    9
[2,]    8    9   10    9   10   10

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    7    7    7    8
[2,]    8    8    9    9
[3,]    9   10   10   10

и список булевых векторов:

[[1]]
[1] FALSE FALSE FALSE FALSE

[[2]]
[1] FALSE FALSE FALSE FALSE FALSE FALSE

[[3]]
[1]  TRUE FALSE FALSE FALSE

Результатом должен быть список с одним элементом:

[[1]]
[1] 7 8 9

1 Ответ

1 голос
/ 15 апреля 2019

Поскольку ваш список содержит матрицы, которые вы вообще не хотите хранить, мы можем сначала создать индексный вектор, который выбирает только элементы списка из listOfColumns, для которых есть хотя бы один TRUE

(idx <- sapply(listOfColumns, any))
# [1] FALSE FALSE  TRUE

Далее мы используем Map для подстановки оставшихся матриц

Map(function(x, cols) x[, cols], x = matrices[idx], cols = listOfColumns[idx])
#[[1]]
#[1] 7 8 9

Спасибо @thelatemail за полезный комментарий.

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