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


88

私がこのようなリストを持っているとしましょう:

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

ネストされたリストの最初の要素のみを含むリストが欲しいのですが。私はそのように別のリストを返すことによってこれを行うことができます

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

このためのショートカット表記はありますか?

回答:


144

ショートカットはそれほど多くありませんが、次のことができます。

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

1
私はそれがより涼しく見えることに同意します。これを行うにはもっと短い方法があることを望んでいましたが、もっとクールな方法で解決します!
アレックス

@ A5C1D2H2I1M1N2O1R2T1清潔さと短さには感謝しますが、「[[」について説明していただけますか??lapplyで役立つものは何も見つかりませんでした
Mehrad Mahmoudian

2
@MehradMahmoudian、見るのに適した場所は「抽出」(stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html)です。
A5C1D2H2I1M1N2O1R2T1 2017

44

別の可能性は素晴らしいpurrrライブラリを使用します:

library(purrr)
map(x, 1)

5
疑問に思っている人のために、これmapは数値を抽出として解釈するので機能します[[
qwr

12

あなたのサンプルリストのためにあなたはただすることができます:

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

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

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

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

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

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


3

我々は使用することができますpluckから、rvestこれは、各ネストされたリストから第一の要素を選択し、

rvest::pluck(x, 1)
#[[1]]
#[1] 1

#[[2]]
#[1] 3

#[[3]]
#[1] 5

これはと異なる結果を与えることに注意してくださいpluckからのpurrr第一の要素を(選択します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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.