41

R の for ループ内からデータ フレームを作成しようとしています。列の名前はループ内で動的に生成され、一部のループ変数の値は、データ フレームの作成中に値として使用されます。たとえば、現在の列の名前は、ループ内の文字列としての変数名にすることができ、列は現在のイテレータの値をデータ フレームの値として取ることができます。

このように、ループの外側に空のデータフレームを作成しようとしました

d = data.frame()

しかし、実際には何もできません。データを入力しようとすると、エラーが発生します

 d[1] = c(1,2)
Error in `[<-.data.frame`(`*tmp*`, 1, value = c(1, 2)) : 
  replacement has 2 rows, data has 0

私がやりたいことを達成するための良い方法は何ですか。よくわからない場合はお知らせください。

4

6 に答える 6

51

次のようにできます。

 iterations = 10
 variables = 2

 output <- matrix(ncol=variables, nrow=iterations)

 for(i in 1:iterations){
  output[i,] <- runif(2)

 }

 output

そしてそれをdata.frame

 output <- data.frame(output)
 class(output)

これが何をするか:

  1. 予想される成長に応じて行と列を持つマトリックスを作成します
  2. 行列に 2 つの乱数を挿入する
  3. ループが終了したら、これをデータフレーム変換します。
于 2012-11-18T17:30:57.040 に答える
50

多くの場合、ループを避けてベクトル化された関数を使用することをお勧めします。それが不可能な場合は、次の 2 つの方法があります。

  1. を事前に割り当てますdata.frame。のインデックス作成は遅いため、これはお勧めできませんdata.frames
  2. data.frameループ内で別のデータ構造を使用し、その後に変換します。Alistはここで非常に便利です。

一般的なアプローチを説明する例:

mylist <- list() #create an empty list

for (i in 1:5) {
  vec <- numeric(5) #preallocate a numeric vector
  for (j in 1:5) { #fill the vector
    vec[j] <- i^j 
  }
  mylist[[i]] <- vec #put all vectors in the list
}
df <- do.call("rbind",mylist) #combine all vectors into a matrix

この例では、a を使用する必要はありませんlist。a を事前に割り当てることができますmatrix。ただし、ループに必要な反復回数がわからない場合は、list.

最後に、サンプル ループのベクトル化された代替例を次に示します。

outer(1:5,1:5,function(i,j) i^j)

ご覧のとおり、よりシンプルで効率的です。

于 2012-11-18T17:32:40.310 に答える