R でリストに要素を追加する
R で任意の数の要素をリストに追加するためにループを使用する方法はたくさんありますが、その中には要素数が多いと処理が重くなってしまうものもあります。このチュートリアルでは、R ループでリストに要素を追加する最も効率的な方法を紹介します。
このようなアルゴリズムを実装する一般的な方法は、while
ループを作成し、ループ内で c
(連結) コマンドを使用することです。各反復の中で、c
関数を使って要素を追加します。この例では、インデックス変数が 10,000 に達するまで値(i*3
)がリストに追加されます。
i <- 1
mylist <- c()
while (i<10) {
mylist <- c(mylist, i*3)
i <- i+1
}
cat(mylist)
出力:
3 6 9 12 15 18 21 24 27
前の例の問題は、連結が実行されるたびにリスト全体がコピーされることです。大規模なデータセットを扱う場合、すべての要素を追加するのにかかる時間は膨大なものになります。
R のリストに length
関数を使って追加する
ループ内で任意の数の要素をリストに追加するためのより効率的な方法は、length
関数を各反復で使用することです。関数 length
を使用すると、リストの要素数を取得し、各新しい要素を最後の要素の後ろのインデックスに代入することができます: length(mylist) + 1
。
以下の例は前の例と同じですが、より効率的です。
i <- 1
mylist <- c()
while (i<10) {
mylist[[(length(mylist) + 1)]] <- i*3
i <- i+1
}
cat(mylist)
出力:
3 6 9 12 15 18 21 24 27
リストの上限を設定する
ループが何回反復するかがあらかじめわかっている場合は、要素のリストを増やすのではなく、固定長のベクトルを定義して、それを使ってすべての要素を保持することができます。例えば、ループの繰り返し回数が 10,000 回とわかっている場合、このようにしてベクトルを初期化することができます。
mylist <- vector("list", 10000)
この後、for
ループを使って各要素の値をインデックスで設定することができます。
i <- 1
for (i in 1:10000) {
mylist[[i]] <- i*3
}
反復回数がわからないが、反復回数に上限がある場合は、この上限を使用してベクトルを定義できます。後で、ループの実行が終了すると、null
以外の要素のみを選択できます。たとえば、ループが 10,000 回を超えて繰り返されないことがわかっている場合は、すべてを使用しない場合でも、10,000 個の要素でベクトルを初期化できます。