2017-09-15 2 views
0

J'ai une liste contenant des matrices de même taille dans R. Je voudrais appliquer une fonction sur le même élément de toutes les matrices. Exemple:Comment appliquer une fonction sur chaque élément de tous les éléments d'une liste dans R

> a <- matrix(1:4, ncol = 2) 
> b <- matrix(5:8, ncol = 2) 
> c <- list(a,b) 
> c 
[[1]] 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

[[2]] 
    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 

Maintenant, je veux appliquer la fonction moyenne et voudrait obtenir une matrice comme ça:

 [,1] [,2] 
[1,] 3 5 
[2,] 4 6 
+0

Dans cet exemple simple, vous pouvez simplement essayer 'd = (a + b)/2' et cela retournera la matrice désirée. –

Répondre

5

Une façon conceptuelle de le faire serait de résumer les matrices, puis prendre la valeur moyenne de chaque entrée. Essayez d'utiliser Reduce:

Reduce('+', c)/length(c) 

Sortie:

 [,1] [,2] 
[1,] 3 5 
[2,] 4 6 

Demo ici:

Rextester

+0

Merci, ça marche super! –

0

Une autre option est de construire un tableau, puis utiliser apply.

étape 1: construction de la matrice.
Utilisation de la bibliothèque abind et do.call, vous pouvez le faire:

library(abind) 
myArray <- do.call(function(...) abind(..., along=3), c) 

en utilisant la base R, vous pouvez enlever la structure, puis le reconstruire comme ceci:

myArray <- array(unlist(c), dim=c(dim(a), length(c))) 

Dans les deux cas, ceux-ci reviennent la matrice souhaitée

, , 1 

    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

, , 2 

    [,1] [,2] 
[1,] 5 7 
[2,] 6 8 

étape 2 : utilisez apply pour calculer la moyenne le long des première et deuxième dimensions.

apply(myArray, 1:2, mean) 
    [,1] [,2] 
[1,] 3 5 
[2,] 4 6 

Ce sera plus souple que Reduce, puisque vous pouvez échanger beaucoup plus de fonctions, mais il sera plus lent pour cette application particulière.