2012-11-28 12 views
5

Durante la creazione di elenchi annidati R ha, ciò che considero, struttura di denominazione utile per gli elementi dell'elenco. Ho una lista di liste e voglio applicare una funzione di ogni singolo vettore contenuto in qualsiasi elenco. lapply esegue questa operazione ma elimina la struttura di denominazione dell'elenco. Come posso lapply di ogni elemento vettoriale dell'elenco nidificato senza rimuovere i nomi? Ho provato a passare l'indice, ma sembra fare la stessa cosa (nomi di strisce). Uscitalapply su elenco annidato e mantiene denominazione/struttura

TEST <- list(n1=list(a="5", b="65"), n2=list(a="f", b= "f6")) 
TEST 
lapply(TEST, function(x) gsub("6", "foo", x)) 
lapply(seq_along(TEST), function(i) gsub("6", "foo", TEST[[i]])) 

Console:

> TEST 
$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "65" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "f6" 


> lapply(TEST, function(x) gsub("6", "foo", x)) 
$n1 
[1] "5" "foo5" 

$n2 
[1] "f" "ffoo" 

Risultato desiderato:

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 
+0

@shujaa sì ho modificato in modo da riflettere il tuo commento +1 –

risposta

10

Sembra si desidera che il rapply variante della * applicare famiglia

rapply(TEST, function(x){gsub("6", "foo", x)}, how = "list") 

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 

Si potrebbe anche fare esso in questo modo di evitare di scrivere una funzione anonima

rapply(TEST, gsub, pattern = "6", replacement = "foo", how = "list") 
+0

Beat me ad esso, e mi ha salvato alcuni digitando – Andrie

+1

Ohh nuova R magia voodoo ho mai giocato con. Grazie Dason. Sapevo di "rapply", ma non come e perché usarlo. Perfezionare. –

+0

Qualsiasi altro modo senza 'rapply'? valuta i suoi argomenti quindi non è utile quando si esegue il loop su oggetti linguaggio. – jangorecki

Problemi correlati