Выбрать первый элемент вложенного списка


86

Допустим, у меня есть такой список:

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

Мне нужен список, содержащий только первые элементы вложенного списка. Я могу сделать это, вернув другой список вроде этого

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

Есть ли для этого ярлыки?

Ответы:


137

Небольшой ярлык, но вы можете сделать это:

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

1
Я согласен, это выглядит круче. Я надеялся, что это будет более короткий способ, но я остановлюсь на более крутом!
Alex

@ A5C1D2H2I1M1N2O1R2T1 Я ценю чистоту и краткость, но не могли бы вы объяснить "[["? Я не нашел ничего полезного в? Lapply
Мехрад Махмудян

2
@MehradMahmoudian, лучше поискать "extract" ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1

43

Другая возможность использует красивую purrrбиблиотеку:

library(purrr)
map(x, 1)

5
Для тех, кому интересно, это работает, поскольку mapчисловые значения интерпретируются как извлекаемые, например[[
qwr

11

Для вашего примера списка вы можете просто сделать:

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

но это зависит от каждого подсписка, имеющего ровно 2 элемента.

Если есть разное количество элементов, вы можете сначала sapplyвычислить длины, затем вычислить соответствующие позиции 1-го элемента (см. cumsum), А затем выбрать эти значения из unlistсписка ed. Но к тому времени принятый ответ, вероятно, будет намного проще.

Если все подсписки имеют одинаковую длину (но могут отличаться от 2), вы можете сделать что-то вроде:

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

или другое приведение к общему объекту. Но я сомневаюсь, что это будет так же эффективно, как и lapplyподход.


2

Мы можем использовать, pluckиз rvestчего выбирает 1-й элемент из каждого вложенного списка

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

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Обратите внимание, что это дает другой результат, pluckиз purrrкоторого выбирается 1-й элемент ( x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

Не совсем короткое обозначение, но это также можно сделать со складкой:

Reduce(function(a, b) c(a, b[1]), x, init = c()) 

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.