2015-05-08 1 views
6

ho un sacco di liste che assomigliano a questoModifica voci di elenco a nome R

:List of 73 
..$ :List of 2 
.. ..$: chr "aaaa" 
.. ..$: num 2 
..$ :List of 2 
.. ..$: chr "cccc" 
.. ..$: num 7 
..$ :List of 2 
.. ..$: chr "dddd" 
.. ..$: num 5 
..$ :List of 2 
.. ..$: chr "bbbb" 
.. ..$: num 6 

eccetera per 73 volte

Quindi ci sono 73 liste all'interno della lista. E ogni parte di questi elenchi contiene due elementi. Ma in effetti è un oggetto e il secondo oggetto è il valore. Come faccio a modificare l'elenco in modo automatizzato in modo che sembra qualcosa di simile:

:List of 73 
$ aaaa: num 2 
$ cccc: num 7 
$ dddd: num 5 
$ bbbb: num 6 

eccetera per 73 volte

Ho un sacco di liste simile a questo, ma ogni volta che il "aaaa "è in un posto diverso, quindi cambiare manualmente richiede molto tempo.

risposta

6

Per ogni elemento x di mylist, è possibile accedere alla prima sottolista con x[[1]]; e il secondo con x[[2]]. Questa funzione può anche essere chiamata come `[[`(x,i) dove i è il numero della sottolista.

mylist <- list(list("aa",2),list("cc",7)) 
str(mylist) 
# List of 2 
# $ :List of 2 
# ..$ : chr "aa" 
# ..$ : num 2 
# $ :List of 2 
# ..$ : chr "cc" 
# ..$ : num 7 
mynewlist <- setNames(lapply(mylist,`[[`,2),sapply(mylist,`[[`,1)) 
str(mynewlist) 
# List of 2 
# $ aa: num 2 
# $ cc: num 7 

setNames(x,xnames) restituisce solo x con i suoi elementi etichettati con xnames.


Non utilizzare un elenco. Probabilmente non è necessario un list e può lavorare con un vettore, che è più semplice:

  • Nella mia risposta, passare il lapply-sapply.
  • In ColonelBeauvel's, rimuovere la chiamata as.list.

Accesso suoi elementi per nome è abbastanza intuitivo:

myvec <- setNames(sapply(mylist,`[[`,2),sapply(mylist,`[[`,1)) 
myvec["aa"] 
# aa 
# 2 
+0

funziona perfettamente! Grazie!!! – Gianni

+1

@Gianni Felice di sentirlo! Appena aggiunto una sezione alla risposta mentre commentavi, potresti prendere in considerazione l'utilizzo di un vettore con nome. – Frank

+0

@Gianni, se questo ha risolto il problema, considera di accettarlo facendo clic sul segno di spunta alla sua sinistra sotto il totale del voto. – gung

1

avrei preferito utilizzare un approccio senza lapply. Se è il vostro lst iniziale list:

x = unlist(lst) 
setNames(as.list(as.numeric(x[seq(2, length(x),2)])),x[seq(1, length(x),2)]) 

#$aaaa 
#[1] 2 

#$cccc 
#[1] 7 

dati:

lst=list(list('aaaa',2), list('cccc',7))