2 votes

Appliquer une opération sur plusieurs listes

Je sais qu'en R, si j'ai une liste de matrices, je peux utiliser la fonction Reduce pour appliquer une opération à toutes les matrices. Par exemple :

l <- list(matrix(rnorm(16), 4, 4), matrix(rnorm(16), 4, 4))
Reduce(`*`, l)

Mais que faire si je veux appliquer cette opération à plusieurs listes ? Je pourrais adopter une approche par force brute avec un fichier for mais j'ai l'impression qu'il devrait y avoir un meilleur moyen. Je peux faire deux listes avec mapply

l2 <- l
mapply(`*`, l, l2, SIMPLIFY = FALSE)

Mais si j'en ai plus de deux, je ne sais pas comment résoudre ce problème.

Les réflexions suivantes entraînent toutes des erreurs :

l3 <- l2
mapply(`*`, l, l2, l3, SIMPLIFY = FALSE)
Error in .Primitive("*")(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) :
  operator needs one or two arguments

Reduce(`*`, list(l, l2, l3))
Error in f(init, x[[i]]) : non-numeric argument to binary operator

La sortie souhaitée est une liste de longueur 2 avec les produits par éléments de chaque matrice dans chaque liste. La boucle de force brute ressemblerait à ceci :

out <- vector("list", length = 2)
for(i in 1:2){
  out[[i]] <- l[[i]] * l2[[i]] * l3[[i]]
}

6voto

lmo Points 31046

Cette combinaison de Reduce y Map produira le résultat souhaité en base R.

# copy the matrix list
l3 <- l2 <- l

out2 <- Reduce(function(x, y) Map(`*`, x, y), list(l, l2, l3))

qui renvoie

out2
[[1]]
              [,1]        [,2]        [,3]       [,4]
[1,] -5.614351e-01 -0.06809906 -0.16847839  0.8450600
[2,] -1.201886e-05  0.02008037  5.64656727 -2.4845526
[3,]  5.587296e-02 -0.54793853  0.02254552  0.4608697
[4,] -9.732049e-04 11.73020448  1.83408770 -1.4844601

[[2]]
              [,1]         [,2]       [,3]        [,4]
[1,] -4.7372339865 -0.398501528  0.8918474  0.12433983
[2,]  0.0007413892  0.151864126 -0.2138688 -0.10223482
[3,] -0.0790846342 -0.413330364  2.0640126 -0.01549591
[4,] -0.1888032661 -0.003773035 -0.9246891 -2.30731237

Nous pouvons vérifier qu'il s'agit de la même chose que l'option for boucle dans l'OP.

identical(out, out2)
[1] TRUE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X