Tengo otra pregunta para las mentes brillantes por ahí (este sitio es tan adictivo).Asignar resultados de un bucle for a una matriz vacía
Estoy ejecutando algunas simulaciones en una matriz y he anidado bucles para este fin. El primero crea un vector que aumenta en uno cada vez que un ciclo hace ciclos. El ciclo anidado ejecuta simulaciones aleatorizando el vector, uniéndolo a la matriz y calculando algunas propiedades simples en la nueva matriz. (Por ejemplo, utilicé propiedades que no variarán en las simulaciones, pero en la práctica requiero las simulaciones para tener una buena idea del impacto del vector aleatorizado.) El ciclo anidado ejecuta 100 simulaciones, y en última instancia solo quiero el medio de columna de esas simulaciones.
Aquí hay un código de ejemplo:
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)
}
El problema que estoy encontrando es cómo rellenar la matriz objeto vacío con los resultados del bucle anidado. Obj termina como un vector de NA en su mayoría, por lo que está claro que no estoy asignando los resultados correctamente. Quiero cada ciclo para añadir una fila de puntal a obj, pero si intento
obj[j,]<-prop
R me dice que hay un número incorrecto de los subíndices en la matriz.
¡Muchas gracias por su ayuda!
EDITS: bien, así que aquí está el código mejorado re las respuestas a continuación:
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)
}
Sin embargo, esto sigue siendo Glitchy, como el mi_archivo sólo debe tener cuatro filas (uno para cada columna de x), pero en realidad tiene 10 filas, con algunas repetidas. ¿Algunas ideas?
¡Fantástico! Gracias por todos estos consejos. – Laura
Puedo solucionar el problema de sobrescritura añadiendo "append = T". Obj funciona correctamente ahora, pero el archivo producido write.table todavía era solo una columna. Lo arreglé creando un segundo marco de datos vacío con los colMeans de obj como filas y luego lo escribí en un archivo csv. – Laura