Как поместить матрицы в список на основе другого списка со значениями, указывающими номера столбцов - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть список матриц (mat_list).Я хочу создать новый список с выбранным подмножеством столбцов из каждой матрицы.У меня есть другой список чисел (col_list), который указывает номера столбцов, чтобы сохранить.Пример набора данных:

> mat_list <- list(structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L), .Dim = c(4L, 3L), .Dimnames = list(NULL, c("V1", "V2", "V3"))),structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L), .Dim = c(4L, 3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))) ; names(mat_list) <- c("mat1","mat2")
> mat_list
$mat1
     V1 V2 V3
[1,]  1  5  9
[2,]  2  6 10
[3,]  3  7 11
[4,]  4  8 12

$mat2
     V1 V2 V3
[1,]  1  5  9
[2,]  2  6 10
[3,]  3  7 11
[4,]  4  8 12

> col_list <- list(structure(c(1,3)),structure(c(2,3))) ; names(col_list) <- c("var1","var2")
> col_list
$var1
[1] 1 3

$var2
[1] 2 3

Мне бы хотелось получить следующий вывод:

> my_list
$mat1
     V1 V3
[1,]  1  9
[2,]  2  10
[3,]  3  11
[4,]  4  12

$mat2
     V2 V3
[1,]  5  9
[2,]  6 10
[3,]  7 11
[4,]  8 12

Я пытался использовать lapply для подстановки этих столбцов во всех матрицах.Самое близкое, что я получил, - это

> lapply(mat_list,function(x) x[,col_list$var1])
$mat1
     V1 V3
[1,]  1  9
[2,]  2 10
[3,]  3 11
[4,]  4 12

$mat2
     V1 V3
[1,]  1  9
[2,]  2 10
[3,]  3 11
[4,]  4 12

. Здесь используются значения из col $ var1, применяемые ко всем матрицам в mat_list.Но я не смог успешно применить это ко всем (обоим) элементам col_list - например, путем реализации lapply для var_list, что-то вроде

lapply(mat_list,function(x) x[,lapply(var_list)])

Я благодарен за любой ввод.

1 Ответ

0 голосов
/ 21 ноября 2018

Вместо lapply, в этом случае mapply идеально подходит:

mapply(function(x, y) x[, y], mat_list, col_list, SIMPLIFY = FALSE)

, что также эквивалентно

Map(function(x, y) x[, y], mat_list, col_list)

Оба подхода применяют указанную функцию, принимая соответствующиеаргументы от mat_list и col_list одновременно.

Причина, по которой lapply не работает, заключается в том, что он работает только с одной переменной, как вы заметили.Чтобы использовать lapply, вместо этого потребуется

lapply(seq_along(mat_list), function(i) mat_list[[i]][, col_list[[i]]])

Бонус: если бы mat_list содержал кадры данных, а не матрицы, можно было бы быть еще более кратким с

mapply(`[`, mat_list, col_list, SIMPLIFY = FALSE)
# or
Map(`[`, mat_list, col_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...