2013-12-06 4 views
40

Допустим, у меня есть список, как это:Выберите первый элемент из вложенного списка

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

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

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

Есть ли обозначение ярлыка для этого?

ответ

66

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

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

(Плюс это выглядит круче, чем анонимная функция ...) – A5C1D2H2I1M1N2O1R2T1

+0

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

+0

@ A5C1D2H2I1M1N2O1R2T1 Я ценю чистоту и краткость, но можете ли вы объяснить «[["? Я не нашел ничего полезного в: lapply –

5

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

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

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

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

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

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

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

19

Другой возможность использует хороший purrr библиотеки:

library(purrr) 
map(x, 1) 
Смежные вопросы