web-dev-qa-db-fra.com

Sélectionner le premier élément de la liste imbriquée

Disons que j'ai une liste comme celle-ci:

x = list(list(1,2), list(3,4), list(5,6))

Je voudrais une liste qui ne contient que les premiers éléments de la liste imbriquée. Je peux le faire en renvoyant une autre liste comme

x1 = lapply(x, function(l) l[[1]])

Existe-t-il une notation de raccourci pour cela?

64
Alex

Pas vraiment un raccourci, mais vous pouvez le faire:

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

Une autre possibilité utilise la bibliothèque Nice purrr:

library(purrr)
map(x, 1)
31
user3603486

Pour votre liste d'exemple, vous pouvez simplement faire:

unlist(x)[ c(TRUE,FALSE) ]

mais cela dépend de chaque sous-liste ayant exactement 2 éléments.

S'il y a différents nombres d'éléments, vous pouvez d'abord faire un sapply pour calculer les longueurs, puis calculer les positions du 1er élément correspondantes (voir cumsum), puis sélectionner ces valeurs dans la liste unlisted liste. Mais à ce moment-là, la réponse acceptée est probablement beaucoup plus simple.

Si toutes les sous-listes ont la même longueur (mais peuvent être différentes de 2), vous pouvez faire quelque chose comme:

do.call( rbind, x)[,1]

ou une autre distribution sur un objet commun. Mais je doute que cela soit aussi efficace que l’approche lapply.

9
Greg Snow