Как преобразовать матрицу в список векторов-столбцов в R? - PullRequest
66 голосов
/ 25 июля 2011

Скажем, вы хотите преобразовать матрицу в список, где каждый элемент списка содержит один столбец. list() или as.list(), очевидно, не будет работать, и до сих пор я использую хак, используя поведение tapply:

x <- matrix(1:10,ncol=2)

tapply(x,rep(1:ncol(x),each=nrow(x)),function(i)i)

Я не совсем доволен этим. Кто-нибудь знает более чистый метод, который я пропускаю?

(для создания списка, заполненного строками, код, очевидно, можно изменить на:

tapply(x,rep(1:nrow(x),ncol(x)),function(i)i)

)

Ответы [ 12 ]

1 голос
/ 01 сентября 2014

Вы можете использовать apply, а затем c с do.call

x <- matrix(1:10,ncol=2)
do.call(c, apply(x, 2, list))
#[[1]]
#[1] 1 2 3 4 5
#
#[[2]]
#[1]  6  7  8  9 10

И похоже, что при добавлении в матрицу он сохранит имена столбцов.

colnames(x) <- c("a", "b")
do.call(c, apply(x, 2, list))
#$a
#[1] 1 2 3 4 5
#
#$b
#[1]  6  7  8  9 10
0 голосов
/ 06 ноября 2017

В тривиальном случае, когда количество столбцов мало и постоянно, я обнаружил, что самый быстрый вариант - просто жестко закодировать преобразование:

mat2list  <- function (mat) lapply(1:2, function (i) mat[, i])
mat2list2 <- function (mat) list(mat[, 1], mat[, 2])


## Microbenchmark results; unit: microseconds
#          expr   min    lq    mean median    uq    max neval
##  mat2list(x) 7.464 7.932 8.77091  8.398 8.864 29.390   100
## mat2list2(x) 1.400 1.867 2.48702  2.333 2.333 27.525   100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...