J'ai comme exemple la liste suivante:

>lista 
[[1]]
      row col   
[1, ]   4 453
[2, ]   5 453

[[2]]
     row col
[1, ] 26 264
[2, ] 26 265
[3, ] 26 266
[4, ] 27 265
[5, ] 27 266

[[3]]
     row col
[1,]  35 364
[1,]  35 365
[2,]  35 366

Le but est de combiner les éléments de la liste, sous la forme: liste [[1]] avec liste [[2]], liste [[1]] avec liste [[3]] successivement (j'ai une liste dans le commande de cinq mille articles ou plus)

Le résultat attendu est:

[[1]]
      row col   
[1, ]   4 453
[2, ]   5 453
[3, ]  26 264
[4, ]  26 265
[5, ]  26 266
[6, ]  27 265
[7, ]  27 266

[[2]]
     row col    
[1, ]  4 453
[2, ]  5 453
[3, ] 35 364
[4, ] 35 365
[5, ] 35 366
.
.
.

Donc, j'ai la fonction suivante qui fonctionne bien, mais comme le nombre d'éléments dans la liste est très grand, ce processus prend beaucoup de temps.

rows_bind <- function(all_GG){
  nn_GG <- length(all_GG)
  lista_analizar <- list()
  cont <- 1
  repeat {
    lista_analizar[[cont]] <- rbind(all_GG[[1]], all_GG[[cont+1]])
    cont = cont + 1
    if (cont == nn_GG){
      break
    }
  }
  return(lista_analizar)
}

Ma question est: comment puis-je optimiser cette fonction? pour l'utiliser dans une fonction comme lapply () ou sapply () . Ou mieux encore, utilisez parSapply () ou parLapply ()

0
rral 19 oct. 2020 à 10:04

2 réponses

Meilleure réponse

Les objets croissants dans une boucle sont généralement inefficaces. Essayez avec Map / lapply:

result <- Map(rbind, lista[1], lista[-1])

En utilisant lapply, vous pouvez écrire ceci comme:

result <- lapply(lista[-1], function(x) rbind(lista[[1]], x))
3
Ronak Shah 19 oct. 2020 à 07:08

Est-ce que ça marche:

> lista <- list(matrix(c(4,5,453,453),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+               matrix(c(26,26,26,27,27,264,265,266,265,266),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col'))),
+               matrix(c(35,35,35,364,365,366),ncol = 2, byrow = F, dimnames = list(NULL,c('row','col')))
+ )
> 
> 
> lapply(seq(2,length(lista)), function(i) do.call(rbind, c(lista[1], lista[i])))
[[1]]
     row col
[1,]   4 453
[2,]   5 453
[3,]  26 264
[4,]  26 265
[5,]  26 266
[6,]  27 265
[7,]  27 266

[[2]]
     row col
[1,]   4 453
[2,]   5 453
[3,]  35 364
[4,]  35 365
[5,]  35 366

> 
1
Karthik S 19 oct. 2020 à 07:15