Selecione o primeiro elemento da lista aninhada


86

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?

Respostas:


137

Não é exatamente um atalho, mas você pode fazer isso:

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

1
Eu concordo que parece mais legal. Eu esperava que houvesse uma maneira mais curta de fazer isso, mas vou me contentar com uma maneira mais legal!
Alex

@ A5C1D2H2I1M1N2O1R2T1 Agradeço a limpeza e o tamanho curto, mas você pode explicar o "[["? Não achei nada útil em? Lapply
Mehrad Mahmoudian

2
@MehradMahmoudian, um lugar melhor para procurar seria "extrair" ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1

43

Outra possibilidade usa a bela purrrbiblioteca:

library(purrr)
map(x, 1)

5
Para aqueles que estão se perguntando, isso funciona, pois mapinterpreta valores numéricos como extração, como[[
qwr

11

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 sapplypara calcular os comprimentos, depois calcular as posições do primeiro elemento correspondente (consulte cumsum) e, em seguida, selecionar esses valores da unlistlista 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 lapplyabordagem.


2

Podemos usar pluckde rvestque seleciona 1º elemento de cada lista aninhada

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

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Note que isso dá resultado diferente com pluckda purrrque seleciona 1º elemento ( x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.