2017-04-20 22 views
1

リスト内の項目の名前と値の両方に個別にアクセスする必要がある場合、R内のリストを反復する最も効率的な方法は何ですか?リスト内のリストを効率的に反復する

lst <- list(a = 1, b = 2) 
for(i in lst) { 
    # ... 
} 

その後、私は唯一の値を取得し、名前にアクセスする方法を見ることができない:私はのような何かをしようとした場合

lst <- list(a = 1, b = 2) 
for(i in names(lst)) { 
    # something with i 
    # something with lst[[i]] 
} 

しかし、私は、私が遅いと仮定し、その名前のリストから各項目にアクセスするので、これは私にはひどく非効率です:

だから現在私がやります。私ができることを避けるためには:

lst <- list(a = 1, b = 2) 
for(i in seq_along(lst)) { 
    # something with names(lst)[i] 
    # something with lst[[i]] 
} 

しかし、これはもう少し効率的かどうかは分かりません。

これらのいずれよりも効率的な方法はありますか?もしそうでなければ、私はこれらのどれを使うべきですか?

編集:

this questionへの答えと@Gladwellは別の提案を与える:

lst <- list(a = 1, b = 2) 
names_lst <- names(lst) 
for(i in seq_along(lst)) { 
    # something with names_lst[i] 
    # something with lst[[i]] 
} 

これは最速のオプションですか?それはどんな方法で改善することができますか?

+1

[FUN内のlapply index namesにアクセスする]の可能な複製(http://stackoverflow.com/questions/9950144/access-lapply-index-names-inside-fun) –

+0

ありがとう、そのアプローチは速くなるようです。私はこれを行う方法を求めていないので、これは重複した質問ではないと思う(私はすでに遅い方法を知っている)。私は最も速い方法を知りたいと思っています。そして、受け入れられた答えのアプローチのスピードの比較はありません。 – Danny

答えて

1

最速の方法は、2つの呼び出しを別々に実行して、ベクトル化された関数を使用して実行することです。

tmpNames <- names(lst) 
tmpValues <- as.vector(unlist(lst)) 

paste0(tmpNames, tmpValues) 

は、現在の実装より約2〜3倍高速です。

+0

ありがとう、私はそれらを別々に保管することを考えていませんでした。私が使用したい機能はベクター化されていないので、私はまだループ/適用が必要ですが、これはまだまだ高速化されていると思いますか? – Danny

+0

あなたがしたいことを知らずに言うのは難しいです。オリジナルの投稿を完全な詳細で更新するか、ループをベクトル化できるかどうかについて別の質問を投稿してください。私は何らかの形でベクター化できない多くの操作を見ていません。 – Gladwell

関連する問題