ループからRのデータフレームに書き込もうとしています。たとえば、このようなループです>
for (i in 1:20) {
print(c(i+i,i*i,i/1))}
3 つの値の各行を 3 つの列を持つデータ フレームに書き込み、各反復が新しい行を取得するようにします。ncol=3 で行で満たされたマトリックスを使用してみましたが、ループから最後の項目しか取得しません。
ありがとう。
rbindを使用できます:
d <- data.frame()
for (i in 1:20) {d <- rbind(d,c(i+i, i*i, i/1))}
別の方法は
do.call("rbind", sapply(1:20, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE))
[,1] [,2] [,3]
[1,] 2 1 1
[2,] 4 4 2
[3,] 6 9 3
[4,] 8 16 4
[5,] 10 25 5
[6,] 12 36 6
を指定しない場合はsimplify = FALSE
、 を使用して結果を転置する必要がありますt
。これは、大規模な構造では退屈な場合があります。
このソリューションは、データセットが大きい場合や、これを何度も繰り返す必要がある場合に特に便利です。
この「スレッド」で解決策のタイミングをいくつか提供します。
> system.time(do.call("rbind", sapply(1:20000, FUN = function(i) c(i+i,i*i,i/1), simplify = FALSE)))
user system elapsed
0.05 0.00 0.05
> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
user system elapsed
0.14 0.00 0.14
> system.time({d <- matrix(nrow=20000, ncol=3)
+ for (i in 1:20000) { d[i,] <- c(i+i, i*i, i/1)}})
user system elapsed
0.10 0.00 0.09
> system.time(ldply(1:20000, function(i)c(i+i, i*i, i/1)))
user system elapsed
62.88 0.00 62.99
For
ループには副作用があるため、これを行う通常の方法は、ループの前に空のデータフレームを作成し、各反復でそれに追加することです。正しいサイズにインスタンス化してから、i
各反復で値を'番目の行に割り当てるか、またはを使用して値を追加し、全体を再割り当てすることができますrbind()
。
前者のアプローチでは、大規模なデータセットのパフォーマンスが向上します。
すべての値が同じ型で、行数がわかっている場合は、次の方法で行列を使用できます (これは非常に高速です)。
d <- matrix(nrow=20, ncol=3)
for (i in 1:20) { d[i,] <- c(i+i, i*i, i/1)}
データフレームが必要な場合は、 rbind (別の回答が示唆するように)、またはパッケージ plyr の関数を次のように使用できます。
library(plyr)
ldply(1:20, function(i)c(i+i, i*i, i/1))