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?

Otra posibilidad usa la bonita
purrrbiblioteca:library(purrr) map(x, 1)fuente
mapinterpreta los valores numéricos como extractores, como[[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 (vercumsum), luego seleccionar esos valores de launlistlista 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.fuente
Podemos usar
pluckdervestque selecciona el primer elemento de cada lista anidadarvest::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 3 #[[3]] #[1] 5Tenga en cuenta que esto da resultado diferente con
pluckdesdepurrrque selecciona primero el elemento (x[[1]])purrr::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 2fuente
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] 5fuente