Виберіть перший елемент вкладеного списку


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
Mehrad Mahmoudian

2
@MehradMahmoudian, кращим місцем для пошуку буде "витяг" ( 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), А потім вибрати ці значення зі списку unlisted. Але на той час прийнята відповідь набагато простіша.

Якщо всі підсписки мають однакову довжину (але можуть відрізнятися від 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.