17

ループからRのデータフレームに書き込もうとしています。たとえば、このようなループです>

for (i in 1:20) {
print(c(i+i,i*i,i/1))}

3 つの値の各行を 3 つの列を持つデータ フレームに書き込み、各反復が新しい行を取得するようにします。ncol=3 で行で満たされたマトリックスを使用してみましたが、ループから最後の項目しか取得しません。

ありがとう。

4

4 に答える 4

24

rbindを使用できます:

d <- data.frame()
for (i in 1:20) {d <- rbind(d,c(i+i, i*i, i/1))}
于 2010-04-01T22:14:54.587 に答える
10

別の方法は

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 
于 2012-06-29T09:31:20.537 に答える
6

Forループには副作用があるため、これを行う通常の方法は、ループの前に空のデータフレームを作成し、各反復でそれに追加することです。正しいサイズにインスタンス化してから、i各反復で値を'番目の行に割り当てるか、またはを使用して値を追加し、全体を再割り当てすることができますrbind()

前者のアプローチでは、大規模なデータセットのパフォーマンスが向上します。

于 2010-04-01T22:17:32.640 に答える
6

すべての値が同じ型で、行数がわかっている場合は、次の方法で行列を使用できます (これは非常に高速です)。

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))
于 2012-06-29T07:47:20.103 に答える