2015-05-08 21 views
6

Ich habe eine Menge von Listen, die diese aussehenändern Listenelemente Name 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 

et cetera für 73 mal

So gibt es 73 Listen innerhalb der Liste. Und jeder Teil dieser Listen enthält zwei Elemente. Aber in der Tat ist es ein Gegenstand und der zweite Gegenstand ist der Wert. Wie kann ich die Liste in einer automatisierten Art und Weise ändern, so dass es so etwas wie folgt aussieht:

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

et cetera für 73 mal

ich viele Listen haben so aussieht, aber jedes Mal die „aaaa "ist an einem anderen Ort, so manuell zu ändern ist sehr zeitaufwendig.

Antwort

6

Für jedes Element x von mylist, können Sie die erste Teilliste mit x[[1]] zugreifen können; und die zweite mit x[[2]]. Diese Funktion kann auch als `[[`(x,i) aufgerufen werden, wobei i die Nummer der Unterliste ist.

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) gibt nur x mit seinen Elementen mit xnames markiert.


mit keiner Liste. Sie wahrscheinlich nicht brauchen ein list und kann mit einem Vektor arbeiten, die einfacher ist:

  • In meiner Antwort, schalten Sie die lapply-sapply.
  • In ColonelBeauvel, entfernen Sie den as.list Anruf.

Zugriff auf seine Elemente nach Name ist recht intuitiv:

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

funktioniert perfekt! Vielen Dank!!! – Gianni

+1

@Gianni Froh, es zu hören! Fügen Sie der Antwort gerade einen Abschnitt hinzu, während Sie kommentieren - Sie sollten vielleicht einen benannten Vektor verwenden. – Frank

+0

@Gianni, wenn dies Ihr Problem behoben hat, ziehen Sie es in Betracht, indem Sie auf das Häkchen links neben der Gesamtsumme klicken. – gung

1

ich eher einen Ansatz ohne lapply verwenden würde. Wenn lst Ihre erste ist 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 

Daten:

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