Wählen Sie das erste Element der verschachtelten Liste aus

86

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?

Alex
quelle

Antworten:

137

Keine große Abkürzung, aber Sie können dies tun:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5
A5C1D2H2I1M1N2O1R2T1
quelle
1
Ich bin damit einverstanden, dass es cooler aussieht. Ich hatte gehofft, dass es einen kürzeren Weg geben würde, aber ich werde mich mit einem kühleren Weg zufrieden geben!
Alex
@ A5C1D2H2I1M1N2O1R2T1 Ich schätze die Sauberkeit und Kürze, aber können Sie das "[[" erklären? Ich fand nichts Nützliches in? Lapply
Mehrad Mahmoudian
2
@MehradMahmoudian, ein besserer Ort zum Suchen wäre "extrahieren" ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1
43

Eine andere Möglichkeit nutzt die schöne purrrBibliothek:

library(purrr)
map(x, 1)

quelle
5
Für diejenigen, die sich fragen, funktioniert dies, da mapnumerische Werte als extrahierend interpretiert werden, wie[[
qwr
11

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 sapplydie Längen berechnen, dann die entsprechenden Positionen der ersten Elemente berechnen (siehe cumsum) und dann diese Werte aus der unlisted-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 lapplyAnsatz.

Greg Snow
quelle
2

Wir können verwenden, pluckaus dem rvestdas 1. Element aus jeder verschachtelten Liste ausgewählt wird

rvest::pluck(x, 1)
#[[1]]
#[1] 1

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Beachten Sie, dass dies ein anderes Ergebnis ergibt, mit pluckdem purrrdas erste Element ( x[[1]]) ausgewählt wird.

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2
Ronak Shah
quelle
0

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
nevrome
quelle