2012-12-06 29 views
7

Ho una lista di elenchi di statistiche di bootstrap da una funzione che ho scritto in R. L'elenco principale ha le 1000 iterazioni di bootstrap. Ogni elemento all'interno dell'elenco è di per sé un elenco di tre elementi, compresi i valori adattati per ciascuna delle quattro variabili ("fvboot" - una matrice 501x4).Creazione di un vettore da elementi di elenco in R

Voglio fare un vettore dei valori per ogni posizione sulla griglia di valori x, da 1: 501, e per ogni variabile, da 1: 4.

Ad esempio, per il punto i-esimo sulla Xgrid della variabile j-esimo, Voglio fare un vettore come il seguente:

 vec = bootfits$fvboot[[1:1000]][i,j] 

ma quando faccio questo, ottengo:

recursive indexing failed at level 2 

google, penso di aver capito perché R sta facendo questo. ma non ho una risposta per come posso ottenere l'elemento ijth di ogni matrice fvboot in un vettore 1000x1.

aiuto sarebbe molto apprezzato.

+0

Ciò che è 'lunghezza (bootfits)'? Se è 3, il tuo primo paragrafo è totalmente fuorviante. Se è 1000, allora non puoi fare 'bootfits $ fvboot'. – flodel

risposta

4

Questo sarebbe più semplice se si fornisce un oggetto di esempio minimo. In generale, non è possibile indicizzare elenchi con vettori come [[1:1000]]. Vorrei utilizzare le funzioni plyr. Questo dovrebbe farlo (anche se non ho provato):

require("plyr") 
laply(bootfits$fvboot,function(l) l[i,j]) 

Se non si ha familiarità con plyr: ho sempre trovato l'articolo di Wickham Hadley 'The split-apply-combine strategy for data analysis' molto utile.

+0

con l'aggiunta di unlist(), che funziona benissimo, grazie! –

1

È possibile estrarre un vettore alla volta utilizzando tranquillamente, ad es. per i = 1 e j = 1:

i <- 1 
j <- 1 
vec <- sapply(bootfits, function(x){x$fvboot[i,j]}) 

sapply svolge la funzione (in questo caso una funzione inline abbiamo scritto) a ciascun elemento delle bootfits lista, e semplifica il risultato se possibile (cioè lo converte da una lista a un vettore).

Per estrarre un insieme di valori come una matrice (ad esempio, su tutto il di i) si può avvolgere questo in un altro sapply, ma questa volta nel corso sulle i per un j specificato:

j <- 1 
mymatrix <- sapply(1:501, function(i){ 
    sapply(bootfits, function(x){x$fvboot[i,j]}) 
}) 

Attenzione: non ho testato questo codice ma penso che dovrebbe funzionare.

4

Usa non elencati() in R. Da example(unlist),

unlist(options()) 
unlist(options(), use.names = FALSE) 

l.ex <- list(a = list(1:5, LETTERS[1:5]), b = "Z", c = NA) 
unlist(l.ex, recursive = FALSE) 
unlist(l.ex, recursive = TRUE) 

l1 <- list(a = "a", b = 2, c = pi+2i) 
unlist(l1) # a character vector 
l2 <- list(a = "a", b = as.name("b"), c = pi+2i) 
unlist(l2) # remains a list 

ll <- list(as.name("sinc"), quote(a + b), 1:10, letters, expression(1+x)) 
utils::str(ll) 
for(x in ll) 
    stopifnot(identical(x, unlist(x))) 
Problemi correlati