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