L'affectation des résultats d'une boucle for pour une matrice vide
J'ai une autre question pour les esprits brillants (ce site est tellement addictif).
Je suis en cours d'exécution des simulations sur une matrice et j'ai des boucles for imbriquées à cette fin. La première crée un vecteur qui augmente d'une unité chaque fois qu'une boucle. La boucle imbriquée est en cours d'exécution des simulations par randomisation du vecteur, en l'attachant à la matrice, et le calcul de certaines propriétés simples sur la nouvelle matrice. (Pour un exemple, j'ai utilisé les propriétés qui ne variera pas dans les simulations, mais dans la pratique, j'ai besoin de la simulation de façon à obtenir une bonne idée de l'impact de la randomisés vecteur.) La boucle imbriquée fonctionne à 100 simulations, et en fin de compte, je veux seulement la colonne moyen de ces simulations.
Voici un exemple de code:
property<-function(mat){ #where mat is a matrix
a=sum(mat)
b=sum(colMeans(mat))
c=mean(mat)
d=sum(rowMeans(mat))
e=nrow(mat)*ncol(mat)
answer=list(a,b,c,d,e)
return(answer)
}
x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4)
obj=matrix(nrow=100,ncol=5,byrow=T) #create an empty matrix to dump results into
for(i in 1:ncol(x)){ #nested for loops
a=rep(1,times=i) #repeat 1 for 1:# columns in x
b=rep(0,times=(ncol(x)-length(a))) #have the rest of the vector be 0
I.vec=append(a,b) #append these two for the I vector
for (j in 1:100){
I.vec2=sample(I.vec,replace=FALSE) #randomize I vector
temp=rbind(x,I.vec2)
prop<-property(temp)
obj[[j]]<-prop
}
write.table(colMeans(obj), 'myfile.csv', quote = FALSE, sep = ',', row.names = FALSE)
}
Le problème que je rencontre est la manière de remplir le vide de l'objet de la matrice avec les résultats de la boucle imbriquée. obj se termine comme un vecteur de la plupart des NAs, donc il est clair que je ne suis pas assigner les résultats correctement. Je veux que chaque cycle pour ajouter une ligne d'accessoire pour obj, mais si j'essaie
obj[j,]<-prop
R me dit qu'il y a un nombre incorrect d'indices sur la matrice.
Je vous remercie beaucoup pour votre aide!
MODIFICATIONS:
Ok, donc voici le code améliorée re les réponses ci-dessous:
property<-function(mat){ #where mat is a matrix
a=sum(mat)
b=sum(colMeans(mat))
f=mean(mat)
d=sum(rowMeans(mat))
e=nrow(mat)*ncol(mat)
answer=c(a,b,f,d,e)
return(answer)
}
x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4)
obj<-data.frame(a=0,b=0,f=0,d=0,e=0) #create an empty dataframe to dump results into
obj2<-data.frame(a=0,b=0,f=0,d=0,e=0)
for(i in 1:ncol(x)){ #nested for loops
a=rep(1,times=i) #repeat 1 for 1:# columns in x
b=rep(0,times=(ncol(x)-length(a))) #have the rest of the vector be 0
I.vec=append(a,b) #append these two for the I vector
for (j in 1:100){
I.vec2=sample(I.vec,replace=FALSE) #randomize I vector
temp=rbind(x,I.vec2)
obj[j,]<-property(temp)
}
obj2[i,]<-colMeans(obj)
write.table(obj2, 'myfile.csv', quote = FALSE,
sep = ',', row.names = FALSE, col.names=F, append=T)
}
Toutefois, il est toujours glitch, comme le myfile ne devrait avoir que quatre lignes (une pour chaque colonne de x), mais en fait a 10 lignes, avec quelques répété. Des idées?
OriginalL'auteur Laura | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Votre
property
fonction retourne une liste. Si vous souhaitez stocker les numéros dans une matrice, il faut retourner un vecteur numérique:Sinon, au lieu de définir
obj
à une matrice, d'en faire undata.frame
(qui théoriquement plus de sens, que chaque colonne représente une quantité différente).Enfin, notez que votre appel à
write.table
va remplacer le contenu demyfile.csv
, de sorte que la seule sortie qu'il va contenir le résultat de la dernière itération. i.Je peux corriger le remplacer problème en ajoutant dans "append=T". obj fonctionne correctement, mais le fichier produit à écrire.la table était toujours qu'une seule colonne. J'ai fixé ce, par la création d'un deuxième vide dataframe avec le colMeans de l'obj de lignes et écrit, alors que pour un fichier csv.
OriginalL'auteur Hong Ooi
Utilisation rbind:
OriginalL'auteur Janne Peltola