2011-08-09 14 views
5

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?

Respuesta

3

Su función property devuelve una lista. Si desea almacenar los números en una matriz, debe tener lo devolverá un vector numérico:

property <- function(mat) 
{ 
    .... 
    c(a, b, c, d, e) # probably a good idea to rename your "c" variable 
} 

Como alternativa, en lugar de definir obj a ser una matriz, lo convierten en un data.frame (que conceptualmente tiene más sentido, como cada columna representa una cantidad diferente).

obj <- data.frame(a=0, b=0, c=0, ...) 
for(i in 1:ncol(x)) 
    .... 
    obj[j, ] <- property(temp) 

Por último, tenga en cuenta que su llamada a write.table sobrescribirá el contenido de myfile.csv, por lo que la única salida que contendrá es el resultado de la última iteración de i.

+0

¡Fantástico! Gracias por todos estos consejos. – Laura

+0

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

2

Uso rbind:

obj <- rbind(obj, prop) 
+1

No es suficiente en sí mismo, pero gracias por la ayuda! – Laura

Cuestiones relacionadas