2015-05-12 10 views
16

Di ', ho il seguente elenco ricorsiva:Sostituire tutti i valori di una lista ricorsiva con valori di un vettore

rec_list <- list(list(rep(1,5), 10), list(rep(100, 4), 20:25)) 
rec_list 
[[1]] 
[[1]][[1]] 
[1] 1 1 1 1 1 

[[1]][[2]] 
[1] 10 


[[2]] 
[[2]][[1]] 
[1] 100 100 100 100 

[[2]][[2]] 
[1] 20 21 22 23 24 25 

Ora, vorrei sostituire tutti i valori della lista, per esempio, con il vettore seq_along(unlist(rec_list)) e mantieni la struttura della lista. Ho provato a utilizzare la sottotitoli indice vuoto come

rec_list[] <- seq_along(unlist(rec_list)) 

Ma questo non funziona.

Come posso ottenere la sostituzione mantenendo la struttura originale dell'elenco?

risposta

23

È possibile utilizzare relist:

relist(seq_along(unlist(rec_list)), skeleton = rec_list) 
# [[1]] 
# [[1]][[1]] 
# [1] 1 2 3 4 5 
# 
# [[1]][[2]] 
# [1] 6 
# 
# 
# [[2]] 
# [[2]][[1]] 
# [1] 7 8 9 10 
# 
# [[2]][[2]] 
# [1] 11 12 13 14 15 16 
+7

Oh, andiamo, come ha fatto trovi quella funzione così velocemente! : -0 – thelatemail

+2

@thelatemail, È proprio lì con 'unlist', se non ricordo male .... – A5C1D2H2I1M1N2O1R2T1

+6

Bene .... ma chi legge la documentazione in questi giorni? – thelatemail

5

Se si voleva unicamente indice di ogni elemento di una lista annidata, si potrebbe iniziare con la funzione rapply() che è la forma ricorsiva della apply() famiglia. Qui uso di una funzione speciale che può indice univoco attraverso un elenco di qualsiasi struttura

rapply(rec_list, 
local({i<-0; function(x) {i<<-i+length(x); i+seq_along(x)-length(x)}}),  
how="replace") 

altre funzioni sono più semplice, ad esempio, se si voleva solo per seq_along ogni subvector

rapply(rec_list, seq_along, how="replace")