Angenommen, ich habe eine Liste wie diese:
x = list(list(1,2), list(3,4), list(5,6))
Ich möchte eine Liste, die nur die ersten Elemente der verschachtelten Liste enthält. Ich kann dies tun, indem ich eine andere Liste wie diese zurückschicke
x1 = lapply(x, function(l) l[[1]])
Gibt es dafür eine Abkürzung?
Eine andere Möglichkeit nutzt die schöne
purrr
Bibliothek:library(purrr) map(x, 1)
quelle
map
numerische Werte als extrahierend interpretiert werden, wie[[
Für Ihre Beispielliste können Sie einfach Folgendes tun:
unlist(x)[ c(TRUE,FALSE) ]
Das hängt jedoch davon ab, dass jede Unterliste genau 2 Elemente enthält.
Wenn es eine unterschiedliche Anzahl von Elementen gibt, können Sie zuerst
sapply
die Längen berechnen, dann die entsprechenden Positionen der ersten Elemente berechnen (siehecumsum
) und dann diese Werte aus derunlist
ed-Liste auswählen . Aber zu diesem Zeitpunkt ist die akzeptierte Antwort wahrscheinlich viel einfacher.Wenn alle Unterlisten dieselbe Länge haben (sich aber von 2 unterscheiden können), können Sie Folgendes tun:
do.call( rbind, x)[,1]
oder eine andere Besetzung eines gemeinsamen Objekts. Ich bezweifle jedoch, dass dies genauso effizient wäre wie der
lapply
Ansatz.quelle
Wir können verwenden,
pluck
aus demrvest
das 1. Element aus jeder verschachtelten Liste ausgewählt wirdrvest::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 3 #[[3]] #[1] 5
Beachten Sie, dass dies ein anderes Ergebnis ergibt, mit
pluck
dempurrr
das erste Element (x[[1]]
) ausgewählt wird.purrr::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 2
quelle
Nicht gerade eine kurze Notation, aber dies kann auch mit einer Falte erfolgen:
Reduce(function(a, b) c(a, b[1]), x, init = c()) # [[1]] # [1] 1 # # [[2]] # [1] 3 # # [[3]] # [1] 5
quelle