2012-03-13 8 views
5

Estoy tratando de guardar los datos de un ciclo de pruebas lógicas.Loop in R: cómo guardar las salidas?

Así que tienen los siguientes datos:

T1 <- matrix(seq(from=100000, to=6600000,length.out=676),26,26) # a matrix of 26X26 - here with illustrive values 

minmax <- seq(from=1,to=49,by=1) # creates a sequence 
Fstep <- 6569141.82/minmax  # define a vector from 0 to 6569141.82 with 49 divisions 
F <- rev(round(Fstep,0))   # round the vector values and re order them 
F 

He runned el siguiente bucle

for (i in 1:49) { 
    print(T1 > F[i]) # I used print to see the results in the screen 
} 

Este circuito me devuelve matrices 49 se rellenaron con valores lógicos (verdadero o falso). Cada matriz es la comparación de T1 contra cada una de las 49 posiciones F [i] (F [1], ...., F [49])

Necesito tener los valores en esas matrices para seguir usando como matrices de adyacencia para trazados de red. Sin embargo, cuando no puedo asignar esos valores lógicos a una matriz, tampoco los guardo en valores csv usando "write.matrix".

Por lo tanto, necesito tener 49 matrices "W" rellenas con valores lógicos (T o F). Ya obtuve esos valores por el ciclo anterior, pero no puedo obtenerlo como un objeto o como una colección de csv. archivos.

me trataron

W<-matrix(0,26,26) #create an empty matrix to assign the logical arguments 
for (i in 1:49){ 
    W[i] <- T1>F[i] # I used print to see the results in the screen 
} 

que devuelve la siguiente advertencia

Warning messages: 
1: In W[i] <- (T1 > F[i]) : 
    number of items to replace is not a multiple of replacement length 

También probé un entorno diferente en el que todas las matrices comparo tienen las mismas dimensiones.

create.M <- function(F){ # a function to transform each position F[i] into a 26X26 matrix 
    for (i in 1:49) { 
    matrix(F[i],26,26) 
    } 
} 

Loop.T1 <- function(T1){ # a function to replicate T1(49 times) 
    for (i in 1:49) { 
    T1 
    } 
} 

y compararon las dos salidas

Loop.T1(T1)>create.M(F) 

que devuelve

logical(0) 
+0

Si se va a utilizar para los bucles que hay que aprender que la asignación es necesaria dentro del bucle. De lo contrario, nada duradero "sucede". –

Respuesta

7

tienda cada matriz booleana como un elemento de una lista:

result <- vector("list",49) 
for (i in 1:49) 
{ 
    result[[i]] <- T1>F[i] # I used print to see the results in the screen 
} 

#Print the first matrix on screen 
result[[1]] 
6

Otra forma de hacer lo que joran sugiere es para nosotros e la familia de funciones apply.

result2 <- lapply(F, function(f) {T1 > f}) 

Esto da lo mismo que de joran result, una lista donde cada elemento corresponde a uno de los valores de F y ese elemento es una matriz lógica 26x26.

Otra alternativa es almacenar los resultados como una matriz lógica tridimensional (49 * 26 * 26) donde cada sector corresponde a uno de los valores de F.

result3 <- sapply(F, function(f) {T1 > f}, simplify="array") 

la estructura de los cuales es

> str(result3) 
logi [1:26, 1:26, 1:49] FALSE FALSE FALSE FALSE TRUE TRUE ... 
+1

Gran Brian. ¡Result2 funciona bien! Iré más allá en la documentación de aplicar familia y la sintaxis de la misma. –