Digamos que eu tenha uma lista como esta:
x = list(list(1,2), list(3,4), list(5,6))
Eu gostaria de uma lista que contivesse apenas os primeiros elementos da lista aninhada. Posso fazer isso retornando outra lista como esta
x1 = lapply(x, function(l) l[[1]])
Existe notação de atalho para isso?
Outra possibilidade usa a bela
purrr
biblioteca:library(purrr) map(x, 1)
fonte
map
interpreta valores numéricos como extração, como[[
Para sua lista de exemplos, você pode apenas fazer:
unlist(x)[ c(TRUE,FALSE) ]
mas isso depende de cada sublista ter exatamente 2 elementos.
Se houver diferentes números de elementos, você pode primeiro fazer um
sapply
para calcular os comprimentos, depois calcular as posições do primeiro elemento correspondente (consultecumsum
) e, em seguida, selecionar esses valores daunlist
lista ed. Mas a essa altura, a resposta aceita provavelmente é muito mais simples.Se todas as sublistas tiverem o mesmo comprimento (mas podem ser diferentes de 2), você pode fazer algo como:
do.call( rbind, x)[,1]
ou algum outro elenco para um objeto comum. Mas duvido que isso seja tão eficiente quanto a
lapply
abordagem.fonte
Podemos usar
pluck
dervest
que seleciona 1º elemento de cada lista aninhadarvest::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 3 #[[3]] #[1] 5
Note que isso dá resultado diferente com
pluck
dapurrr
que seleciona 1º elemento (x[[1]]
)purrr::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 2
fonte
Não é exatamente uma notação curta, mas também pode ser feita com uma dobra:
Reduce(function(a, b) c(a, b[1]), x, init = c()) # [[1]] # [1] 1 # # [[2]] # [1] 3 # # [[3]] # [1] 5
fonte