2016-04-09 2 views
-1

Допустим, у меня есть матрица списков:R: применить функцию к каждому элементу матрицы списков и возвращать результат в том же формате матрицы

theList <- matrix(list(rnorm(10), rnorm(10), rnorm(10), rnorm(10)), nrow=2, ncol=2) 
theList 
    [,1]  [,2] 
[1,] Numeric,10 Numeric,10 
[2,] Numeric,10 Numeric,10 

И я хочу, чтобы применить некоторую функцию к каждому элементу эта матрица сохраняет прежние размеры.

Я обнаружил, что следующие работы с sapply:

apply(theList, 2, sapply, mean) 
      [,1]  [,2] 
[1,] 0.5678905 0.0577225 
[2,] -0.2708252 0.5045110 

Однако он не работает с lapply:

apply(theList, 2, lapply, mean) 
[[1]] 
[[1]][[1]] 
[1] 0.5678905 

[[1]][[2]] 
[1] -0.2708252 


[[2]] 
[[2]][[1]] 
[1] 0.0577225 

[[2]][[2]] 
[1] 0.504511 

Как применить функцию к каждому списку в матрице списков и возврата данные в том же формате - матрица списков с одинаковыми размерами?

+1

Матрица списков - это ужасная структура данных. Кроме того, почему вы заботитесь о 'lapply()', если 'sapply()' работал нормально? –

+0

Для меня это была бы хорошая структура, если бы это сработало. Я не хочу 'sapply', потому что он ограничен функциями, возвращающими одно значение в качестве вывода. 'lapply' является более общим и последовательным. –

+1

Я предполагаю, что 'simplify2array (apply (theList, 2, lapply, mean))' будет работать. Или даже '\' dim <- \ '(lapply (theList, mean), dim (theList))' –

ответ

1

Нецелесообразно перестраивать матрицу из вектора или списка, поскольку он устанавливает только объект dim. Так что я хотел бы сделать это:

res <- matrix(lapply(theList,mean),nrow(theList)); 
res; 
##  [,1]  [,2] 
## [1,] -0.1956084 0.03062223 
## [2,] -0.2106935 0.1842444 

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

str(res); 
## List of 4 
## $ : num -0.196 
## $ : num -0.211 
## $ : num 0.0306 
## $ : num 0.184 
## - attr(*, "dim")= int [1:2] 2 2 
+0

Спасибо +1. У меня был аналогичный подход, чтобы сделать матрицу результатом. Но искал «более элегантное» решение. Пока что выяснилось, что пакет 'plyr'' llply', похоже, хорошо выполняет эту работу. Но в базе R этот ответ, который вы дали, является лучшим до сих пор. –

0

Похоже этот подход от plyr работаю:

library(plyr) 
llply(theList, range) 
     [,1]  [,2] 
[1,] Numeric,2 Numeric,2 
[2,] Numeric,2 Numeric,2 
0

Что об этом, Есть много функций в purrr для отображающей функции в случае, как ваши,

library(purrr) 
apply(theList, 2, map_dbl, mean)