Допустим, у меня есть такой список:
x = list(list(1,2), list(3,4), list(5,6))
Мне нужен список, содержащий только первые элементы вложенного списка. Я могу сделать это, вернув другой список вроде этого
x1 = lapply(x, function(l) l[[1]])
Есть ли для этого ярлыки?
Другая возможность использует красивую
purrr
библиотеку:library(purrr) map(x, 1)
источник
map
числовые значения интерпретируются как извлекаемые, например[[
Для вашего примера списка вы можете просто сделать:
unlist(x)[ c(TRUE,FALSE) ]
но это зависит от каждого подсписка, имеющего ровно 2 элемента.
Если есть разное количество элементов, вы можете сначала
sapply
вычислить длины, затем вычислить соответствующие позиции 1-го элемента (см.cumsum
), А затем выбрать эти значения изunlist
списка ed. Но к тому времени принятый ответ, вероятно, будет намного проще.Если все подсписки имеют одинаковую длину (но могут отличаться от 2), вы можете сделать что-то вроде:
do.call( rbind, x)[,1]
или другое приведение к общему объекту. Но я сомневаюсь, что это будет так же эффективно, как и
lapply
подход.источник
Мы можем использовать,
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
источник
Не совсем короткое обозначение, но это также можно сделать со складкой:
Reduce(function(a, b) c(a, b[1]), x, init = c()) # [[1]] # [1] 1 # # [[2]] # [1] 3 # # [[3]] # [1] 5
источник