0

約 500,000 行のデータフレームがあります。これらの列の 1 つに正の整数値が含まれています。たとえば、列 A とします。別の列 B があるとします。

行数が sum(dataframe$A) に等しい 2 番目のデータフレームを作成する必要があります。これが行われます。

この新しいデータ フレームにデータを入力する必要がある場合、パフォーマンスの問題が発生します。次のように、この 2 番目のフレームの列 A2 を作成しようとしています。

A2<-vector() 
for (i in 1:nrow(dataframe)){
  A2<-c(A2,rep(dataframe$B[i],dataframe$A[i]))
}

多数の行が処理されているため、外部ループは明らかに非常に低速です。より高速な処理でこのタスクを達成する方法に関する提案。

回答ありがとうございます

4

1 に答える 1

4

ループはまったく必要ありません。 repはすでにベクトル化されています。

A2 <- rep(dataframe$B, dataframe$A)

動作するはずです。再現可能な例として、組み込みのmtcarsデータセットを使用した方法を次に示します。

x <- vector()
for(i in 1:nrow(mtcars)) {x <- c(x, rep(mtcars$cyl[i], mtcars$gear[i]))}
> x
  [1] 6 6 6 6 6 6 6 6 4 4 4 4 6 6 6 8 8 8 6 6 6 8 8 8 4 4 4 4 4 4 4 4 6 6 6 6 6
 [38] 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8
 [75] 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 8 8 8 6 6 6 6 6 8 8
[112] 8 8 8 4 4 4 4

ベクトル化すると、次のようになります。

x2 <- rep(mtcars$cyl, mtcars$gear)
> x2
  [1] 6 6 6 6 6 6 6 6 4 4 4 4 6 6 6 8 8 8 6 6 6 8 8 8 4 4 4 4 4 4 4 4 6 6 6 6 6
 [38] 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8
 [75] 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 8 8 8 6 6 6 6 6 8 8
[112] 8 8 8 4 4 4 4

これは、ループを使用するよりも桁違いに高速です。

于 2012-07-09T06:26:08.090 に答える