2017-10-18 6 views
2

Je travaille avec l'écologie communautaire et j'essaie de randomiser ma matrice ~ 999 fois et d'extraire une valeur de diversité bêta pour chacune de ces 999 fois. J'espère que cela me donnera une distribution nulle pour comparer mes valeurs réelles. Cependant, j'ai vraiment du mal à exécuter une fonction de boucle pour cela.Comment exécuteriez-vous une boucle pour randomiser une matrice de communauté et la stocker?

est donc ici quelques exemples de données:

com.dat<-matrix(c(10,0,0,0,5,0, 0,3,4,0,0,9, 0,0,8,6,0,0, 7,0,9,0,0,0, 
5,3,2,2,1,2),nrow=5,byrow=TRUE) 
rownames(com.dat)<-c("Site1","Site2","Site3","Site4","Site5") 
colnames(com.dat)<- 
c("Species1","Species2","Species3","Species4","Species5","Species6") 

C'est ce que je ferais pour une itération:

library(picante) 
x<-randomizeMatrix(com.dat, null.model = "richness", iterations = 1000) 
library(betapart) 
b<-beta.multi.abund(x, index.family = "bray") 

B est la valeur que je veux garder et avoir 998 autres valeurs de. J'ai essayé de courir une boucle pour obtenir 999 seulement des matrices qui sont répartis de façon aléatoire de la fonction randomizeMatrix

table<-list() 

for (i in 1:999) { 
    table[i]<-randomizeMatrix(com.dat, null.model = "richness", iterations = 
1000) 
} 

Maintenant, ma boucle faisant des capacités sont encore à un niveau débutant, mais je suis sûr que boucle ci-dessus devrait fonctionner. Les listes sont capables de stocker plusieurs matrices (pour autant que je sache) donc la table [i] devrait être en mesure de contenir 999 version randomisée de la matrice initiale droite? Pourtant, chaque fois que j'essaie de l'exécuter, ma session Rstudio expire. En fin de compte, je voudrais obtenir une trame de données avec 999 valeurs aléatoires de "b". Toute aide serait appréciée.

+0

Vous pouvez faire avec un '' lapply' i..e lapply (1: 999, fonction (i) randomizeMatrix (com.dat, null.model = " richesse ", itérations = 1000))' pour créer une "liste" de matrices. Aussi, si vous utilisez la boucle 'for', initialisez la' list' à la longueur dont vous avez besoin ie 'lst <- vector ('list', 999)' et attribuez la sortie comme 'lst [[i]] <- randomize ... ' – akrun

+0

@akrun okthank vous, je voulais ajouter que la fonction code'b <-beta.multi.abund (x, index.family =" bray ") 'donne une liste de trois valeurs. Donc, si chaque matrice générée affiche une liste de 3 valeurs, comment puis-je utiliser la famille d'applications pour générer une base de données dans laquelle chaque valeur de chaque matrice se trouve dans ses propres colonnes? Par exemple la matrice numéro un me donne une liste de trois valeurs sous forme de liste et je veux chacune de ces valeurs dans une colonne d'une nouvelle base de données? –

+0

Ce n'est pas tout à fait clair pour moi. Avez-vous besoin de 'do.call (cbind, lapply (1: 2, fonction (i) {x <- randomizeMatrix (com.dat, null.model =" richesse ", itérations = 1000), unlist (beta.multi.abund (x, index.family = "bray"))})) '(ici j'utilise seulement 2 itérations) – akrun

Répondre

1

Nous pouvons le faire en utilisant lapply

do.call(rbind, lapply(1:2, function(i) { 
     x <- randomizeMatrix(com.dat, null.model = "richness", iterations = 1000) 
     unlist(beta.multi.abund(x, index.family = "bray")) 
    })) 
#  beta.BRAY.BAL beta.BRAY.GRA beta.BRAY 
#[1,]  0.7686567 0.008321701 0.7769784 
#[2,]  0.6693548 0.012815704 0.6821705