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?

Respuestas:


137

No es un atajo, pero puedes hacer esto:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5

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)

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.