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
purrr
biblioteca:library(purrr) map(x, 1)
fuente
map
interpreta 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
sapply
para calcular las longitudes, luego calcular las posiciones correspondientes del primer elemento (vercumsum
), luego seleccionar esos valores de launlist
lista 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
lapply
enfoque.fuente
Podemos usar
pluck
dervest
que selecciona el primer elemento de cada lista anidadarvest::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 3 #[[3]] #[1] 5
Tenga en cuenta que esto da resultado diferente con
pluck
desdepurrr
que selecciona primero el elemento (x[[1]]
)purrr::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 2
fuente
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
fuente