Ответ 1
Вы должны разбить матричный мат перед применением функции f.
list_result <- lapply(split(mat,seq(NROW(mat))),f)
matrix_result <- do.call(rbind,list_result)
У меня есть матрица и функция, которая берет вектор и возвращает матрицу. Я хочу применить функцию ко всем строкам матрицы и объединить все результаты. Например
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 возвращает матрицу, из которой я не могу получить результат, который я хочу. Можно ли принудительно применить заявку для возврата списка или есть другое решение?
Вы должны разбить матричный мат перед применением функции f.
list_result <- lapply(split(mat,seq(NROW(mat))),f)
matrix_result <- do.call(rbind,list_result)
Вот почему я люблю пакет plyr
. Он имеет ряд функций --ply
, которые работают одинаково. Первая буква соответствует тому, что у вас есть в качестве ввода, а второй метод соответствует тому, что у вас есть в качестве вывода (l
для списков, a
для массивов, d
для фреймов данных).
Итак, функция alply()
работает аналогично apply()
, но всегда возвращает список:
alply(mat, 1, f)