Seleccione el primer elemento de la lista anidada

86

Digamos que tengo una lista como esta:

x = list(list(1,2), list(3,4), list(5,6))

Me gustaría una lista que contenga solo los primeros elementos de la lista anidada. Puedo hacer esto devolviendo otra lista así

x1 = lapply(x, function(l) l[[1]])

¿Existe una notación de atajo para esto?

Alex
fuente

Respuestas:

137

No es un atajo, pero puedes hacer esto:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5
A5C1D2H2I1M1N2O1R2T1
fuente
1
Estoy de acuerdo en que se ve más genial. Esperaba que hubiera una forma más corta de hacer esto, ¡pero me conformaré con una forma más genial!
Alex
@ A5C1D2H2I1M1N2O1R2T1 Aprecio la limpieza y la brevedad, pero ¿puedes explicar el "[["? No encontré nada útil en? Lapply
Mehrad Mahmoudian
2
@MehradMahmoudian, un mejor lugar para buscar sería "extraer" ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1
43

Otra posibilidad usa la bonita purrrbiblioteca:

library(purrr)
map(x, 1)

fuente
5
Para aquellos que se preguntan, esto funciona ya que mapinterpreta los valores numéricos como extractores, como[[
qwr
11

Para su lista de ejemplo, puede hacer lo siguiente:

unlist(x)[ c(TRUE,FALSE) ]

pero eso depende de que cada sublista tenga exactamente 2 elementos.

Si hay diferentes números de elementos, primero puede hacer una sapplypara calcular las longitudes, luego calcular las posiciones correspondientes del primer elemento (ver cumsum), luego seleccionar esos valores de la unlistlista ed. Pero en ese momento, la respuesta aceptada probablemente sea mucho más simple.

Si todas las sublistas tienen la misma longitud (pero podrían ser diferentes de 2), entonces podría hacer algo como:

do.call( rbind, x)[,1]

o algún otro molde a un objeto común. Pero dudo que esto sea tan eficiente como el lapplyenfoque.

Greg Snow
fuente
2

Podemos usar pluckde rvestque selecciona el primer elemento de cada lista anidada

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

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Tenga en cuenta que esto da resultado diferente con pluckdesde purrrque selecciona primero el elemento ( x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

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

No es exactamente una notación corta, pero esto también se puede hacer con un pliegue:

Reduce(function(a, b) c(a, b[1]), x, init = c()) 

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
nevrome
fuente