2012-11-28 10 views
5

Podczas tworzenia zagnieżdżonych list R ma, co uważam, użyteczną strukturę nazw dla elementów listy. Mam listę list i chcę zastosować funkcję każdego wektora zawartego na dowolnej liście. lapply robi to, ale potem usuwa strukturę nazewnictwa listy. Jak mogę lapply każdego elementu wektorowego zagnieżdżonej listy bez zdzierania nazw? Próbowałem zamiast tego podać indeks, ale wydaje się, że robi to samo (nazwy pasków).lapply nad listą zagnieżdżoną i zachować nazwę/strukturę

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]])) 

konsoli wyjściowa:

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

Oczekiwane rezultaty:

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

$n1$b 
[1] "foo5" 


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

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

@shujaa tak stworzony, aby odzwierciedlić swój komentarz –

Odpowiedz

10

Wydaje chcesz wariant rapply i * zastosowanie rodziny

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" 

Można również zrobić to tak aby uniknąć pisania anonimowej funkcji

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

+1 beat mnie do niego i zaoszczędziło mi trochę wpisując – Andrie

+1

Ohh nowy R voodoo magii Nigdy nie grałem z. Dzięki Dason. Wiedziałem o "rapply", ale nie jak i dlaczego go używać. Idealny. –

+0

W inny sposób bez "rapply"? ocenia swoje argumenty, więc nie jest użyteczne, gdy zapętla się obiekty językowe. – jangorecki

Powiązane problemy