Принудительно применить, чтобы вернуть список - PullRequest
12 голосов
/ 05 июня 2011

У меня есть матрица и функция, которая берет вектор и возвращает матрицу. Я хочу применить функцию ко всем строкам матрицы и связать все результаты вместе. Например

mat <- matrix(1:6, ncol=2)
f <- function (x) cbind(1:sum(x), sum(x):1)
do.call(rbind, apply(mat, 1, f))

Это прекрасно работает, так как возвращаемые матрицы имеют разное количество строк, поэтому apply возвращает список. Но если они имеют одинаковое количество строк, это больше не работает:

mat <- f(3)
apply(mat, 1, f)

apply возвращает матрицу, из которой я не могу получить желаемый результат. Можно ли принудительно применить возврат к списку или есть другое решение?

Ответы [ 2 ]

18 голосов
/ 05 июня 2011

Вот почему я люблю пакет plyr.Он имеет ряд --ply функций, которые работают одинаково.Первая буква соответствует тому, что у вас есть в качестве ввода, а второй метод соответствует тому, что вы имеете в качестве вывода (l для списков, a для массивов, d для фреймов данных).alply() функция работает аналогично apply(), но всегда возвращает список:

alply(mat, 1, f)
13 голосов
/ 05 июня 2011

Вы должны разделить матричный мат перед применением функции f.

list_result <- lapply(split(mat,seq(NROW(mat))),f)
matrix_result <- do.call(rbind,list_result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...