2012-03-13 15 views
5

Sto cercando di salvare i dati da un loop di test logici.Loop in R: come salvare le uscite?

Così ho i seguenti dati:

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 

ho runned il seguente ciclo

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

Questo ciclo mi torna 49 matrici riempiti con i valori logici (vero o falso). Ogni matrice è il confronto di T1 contro ciascuna delle 49 posizioni F [i] (F [1], ...., F [49])

Ho bisogno di avere i valori in quelle matrici per ulteriore utilizzo come matrici di adiacenza per i grafici di rete. Tuttavia, quando non posso né assegnare quei valori logici a una matrice, né salvarli in valori CSV utilizzando "write.matrix".

Quindi, ho bisogno di avere 49 - matrici "W" compilate con valori logici (T o F). Ho già ottenuto quei valori dal ciclo sopra ma non riesco a ottenerlo come oggetto o come collezione di csv. File.

Ho provato

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 
} 

che restituisce il seguente avviso

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

Ho anche provato una diversa impostazione in cui tutte le matrici paragono hanno le stesse dimensioni.

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 
    } 
} 

e confrontato le due uscite

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

che restituisce

logical(0) 
+0

Se avete intenzione di usare per-loop avete bisogno di imparare che l'assegnazione è necessario all'interno del ciclo. Altrimenti non accade nulla di duraturo. –

risposta

7

Conservare ogni matrice booleana come un elemento in un elenco:

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

Un altro modo per farlo quello che joran suggerisce è per noi e la famiglia di funzioni applicabile.

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

Questo dà la stessa cosa joran di result, una lista in cui ogni elemento corrisponde ad uno dei valori di F e tale elemento è una matrice binaria 26x26.

Un'altra alternativa è memorizzare i risultati come una matrice logica tridimensionale (49 * 26 * 26) in cui ogni sezione corrisponde a uno dei valori di F.

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

la cui struttura è

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

Ottimo Brian. Risultato2 funziona bene! Andrò più avanti nella documentazione di applicare la famiglia e la sua sintassi. –