2015-07-22 11 views
11

So che questo argomento è apparso su SO alcune volte, ma gli esempi erano spesso più complicati e mi piacerebbe avere una risposta (o una serie di possibili soluzioni) a questa semplice situazione. Sto ancora avvolgendo la mia mente su R e la programmazione in generale. Quindi, qui voglio utilizzare la funzione lapply o un semplice ciclo nell'elenco data che è un elenco di tre elenchi di vettori.lapply function/loop sull'elenco di elenchi R

data1 <- list(rnorm(100),rnorm(100),rnorm(100)) 
data2 <- list(rnorm(100),rnorm(100),rnorm(100)) 
data3 <- list(rnorm(100),rnorm(100),rnorm(100)) 

data <- list(data1,data2,data3) 

Ora, voglio ottenere l'elenco dei mezzi per ciascun vettore. Il risultato sarebbe un elenco di tre elementi (elenchi).

so solo come ottenere la lista dei risultati per una lista di vettori e

for (i in 1:length(data1)){ 
     means <- lapply(data1,mean) 
} 

o da:

lapply(data1,mean)

e so come ottenere tutti i mezzi che utilizzano rapply:

rapply(data,mean)

Il problema è che il rapply non mantiene la struttura dell'elenco. La guida e possibilmente alcuni suggerimenti/spiegazioni sarebbe molto apprezzata.

risposta

28

Siamo in grado di scorrere l'elenco di lista con un nidificato lapply/sapply

lapply(data, sapply, mean) 

altrimenti è scritto come

lapply(data, function(x) sapply(x, mean)) 

O se avete bisogno l'uscita con la struttura list, un nidificato lapply può essere utilizzato

lapply(data, lapply, mean) 

Oppure con rapply, possiamo usare l'argomento how per ottenere quale tipo di output vogliamo.

rapply(data, mean, how='list') 

Se stiamo usando un ciclo for, potremmo aver bisogno di creare un oggetto per memorizzare i risultati.

res <- vector('list', length(data)) 
    for(i in seq_along(data)){ 
    for(j in seq_along(data[[i]])){ 
     res[[i]][[j]] <- mean(data[[i]][[j]]) 
    } 
    } 
+0

wow, questo è fantastico (e in qualche modo completamente non intuitivo per me, come ho imparato i loop tradizionali prima). solo per cogliere l'idea, ti dispiacerebbe mostrare come sarebbe il ciclo tradizionale? questo mi aiuterebbe ad avere un'idea della struttura di indicizzazione nel caso in cui ho bisogno di applicare alcune funzioni più complicate – MIH

+1

Aggiornato il post – akrun

+0

grazie mille, enorme aiuto! – MIH