web-dev-qa-db-ja.com

ネストされたリストの最初の要素を選択

次のようなリストがあるとしましょう:

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

ネストされたリストの最初の要素のみを含むリストが必要です。別のリストを返すことでこれを行うことができます

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

これにショートカット表記はありますか?

64
Alex

あまりショートカットではありませんが、これを行うことができます:

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

別の可能性は、Nice purrrライブラリを使用します。

library(purrr)
map(x, 1)
31
user3603486

あなたの例のリストのためにあなたはちょうどすることができます:

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

しかし、それは正確に2つの要素を持つ各サブリストに依存します。

要素の数が異なる場合は、最初にsapplyを実行して長さを計算し、次に対応する最初の要素の位置を計算し(cumsumを参照)、unlistedからそれらの値を選択しますリスト。しかし、その時までに受け入れられた答えはおそらくはるかに簡単です。

すべてのサブリストの長さが同じである場合(ただし、2とは異なる場合があります)、次のようなことができます。

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

または共通オブジェクトへのその他のキャスト。しかし、これはlapplyアプローチと同じくらい効率的だとは思いません。

9
Greg Snow