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?

Alex
fonte

Respostas:

137

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

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5
A5C1D2H2I1M1N2O1R2T1
fonte
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)

fonte
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.

Greg Snow
fonte
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
Ronak Shah
fonte
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
nevrome
fonte