Comment convertir une liste en masortingce plus efficacement en R?

J’ai une liste de longueur 130 000 où chaque élément est un vecteur de caractères de longueur 110. Je voudrais convertir cette liste en une masortingce de dimension 1,430,000 * 10. Comment puis-je le faire plus efficacement? Mon code est:

output=NULL for(i in 1:length(z)) output=rbind(output,masortingx(z[[i]],ncol=10,byrow=T)) 

Cela devrait être équivalent à votre code actuel, mais beaucoup plus rapidement:

 output <- matrix(unlist(z), ncol = 10, byrow = TRUE) 

Je pense que tu veux

 output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE)) 

c'est-à-dire combiner l'utilisation de do.call(rbind,...) par @ BlueMagister avec une instruction lapply pour convertir les éléments de liste individuels en 11 * 10 masortingces ...

Benchmarks (montrer la solution unlist de unlist est 5 fois plus rapide que la mienne, et 230 fois plus rapide que l'approche originale ...)

 n <- 1000 z <- replicate(n,matrix(1:110,ncol=10,byrow=TRUE),simplify=FALSE) library(rbenchmark) origfn <- function(z) { output <- NULL for(i in 1:length(z)) output<- rbind(output,matrix(z[[i]],ncol=10,byrow=TRUE)) } rbindfn <- function(z) do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE)) unlistfn <- function(z) matrix(unlist(z), ncol = 10, byrow = TRUE) ## test replications elapsed relative user.self sys.self ## 1 origfn(z) 100 36.467 230.804 34.834 1.540 ## 2 rbindfn(z) 100 0.713 4.513 0.708 0.012 ## 3 unlistfn(z) 100 0.158 1.000 0.144 0.008 

Si cela évolue de manière appropriée (c.-à-d. Que vous ne rencontrez pas de problèmes de mémoire), le problème complet prend environ 130 * 0,2 secondes = 26 secondes sur une machine comparable (je l'ai fait sur un MacBook Pro de 2 ans).

Il serait utile d’avoir des informations sur votre sortie. L’utilisation récursive de rbind sur des choses de plus en plus grandes n’est pas recommandée . Ma première supposition à quelque chose qui pourrait vous aider:

 z <- list(1:3,4:6,7:9) do.call(rbind,z) 

Voir une question connexe pour plus d'efficacité, si nécessaire.

vous pouvez utiliser as.masortingx comme ci-dessous:

 output <- as.matrix(z)