1

この質問には複数のステップがありますので、ご容赦ください。

前提 私が作成したスクリプトは、43000 列のスプレッドシートを再コーディングします。各列は、177 の観測値を持つ一意の変数です。観測値はすべて異なり、10 進数です。

個々の変数はそれぞれ 2 つのグループに再コード化されます。カットオフポイントに基づいています。このカットオフ ポイントは、私が書いた以前のスクリプトから生成されたものです。各変数/列に関連付けられたカットオフ ポイントが 1 つあります。したがって、カットオフは一意であり、43000 カットオフ番号のリストから供給されます。これに基づいて、列内の数値は 2 つのグループに再コード化されます。1 または 0 のいずれか - それらが > か < かによって異なります。以下の例を参照してください。

これまでに行った方法は、たとえば R plyr パッケージを使用することです。

Genedata$SPOCK1.202363_at_recode[Genedata$SPOCK1.202363_at<= 8.2244399999999995] <- "0"
Genedata$SPOCK1.202363_at_recode[Genedata$SPOCK1.202363_at> 8.2244399999999995] <- "1"
Genedata_Recoded$SPOCK1.202363_at_recode <- factor(Genedata$SPOCK1.202363_at_recode)

この場合、変数は :SPOCK1.202363_atで、カットオフは 8.2244399999999995 です。

ただし、変数名とカットオフの両方が個々の変数ごとに変化することを考えると、applyR で関数を使用する方法がわかりません。

その結果、私は現在、R 関数を呼び出すことができる Python モジュールである PyPer を使用しています。placeholder を使用して、%s各変数名とカットオフ値を繰り返し置き換えます。

問題

1) 現在、CSV ファイルを開くのに時間がかかる --> バイナリ ファイルまたはマトリックスとして保存すると、これが高速化されると思います。ただし、これは優先事項ではありません。

2) 繰り返します。plyrパッケージを使用してrecode関数を使用して、2つの変化する変数でapply関数を使用する方法はありますか?

3) 反復にかかる現在の時間は、変数によって非線形に増加しているようです。1000 変数の場合は約 30 秒かかりますが、43000 の場合は遅くなるようです。これの原因はわかりません。おそらく説明?

4) マルチプロセッシング パッケージを使用して反復タスクを簡単に並列化し、速度をさらに向上させる方法はありますか

更新:なぜ「0」と「1」が数値か非数値かは関係ありません。それを選んだだけです。最終的に、私の分析の次の部分は、数値かどうかに関係なく 2 つのグループを取り、それを処理します。

更新 2:前提をより明確に言い換えました

4

1 に答える 1

1

アイデア # 1: しない理由:

Genedata$SPOCK1.202363_at_recode <- factor( Genedata$SPOCK1.202363_at <= 8.2244399999999995, 
                                      labels=c("0", "1") )

そうすれば、不等式を 2 回処理する必要がなくなります。factor論理ベクトルとして受け入れることができれば、呼び出しをスキップできます。

Genedata$SPOCK1.202363_at_recode <-  Genedata$SPOCK1.202363_at <= 8.2244399999999995

アイデア #2: これは、"X" という名前の行列の複数の行で確実に高速になります。

X <- (X < rep( colMeans(X), each=nrow(X) ) )

次のようにできます。

Genedata[ , cols_to_process] <- ( Genedata[ , cols_to_process] < 
                                  rep( cutoff_vector, 
                                         each=nrow(Genedata[ , cols_to_process]) ) )

これは本質的に @flodel のコメントが示唆していたことであることに注意してください。なぜなら、彼は列を行に変換し、引数のリサイクルに依存してから、元の構造を復元していたからです。並列化オプションに関しては、このかなり小さなデータセットが努力を保証するものではないと思います。これには、5 年前のマシンで約 3 分かかりました。

 dfrm <- data.frame(matrix(rnorm(43000*170), 170) )
 cutoff <- rnorm(43000, 0, 0.2)
 system.time( dfrm[ , 1:43000] <- ( dfrm[ , 1:43000] < 
                                   rep( cutoff, 
                                          each=170 ) ) )
#   user  system elapsed 
#129.052  57.449 185.660 

行列に変換すると、これが大幅に高速化される可能性があります。

 mtx <- matrix(rnorm(43000*170), 170) 
 system.time( mtx <- t(1*(t(mtx) > cutoff) )  )
 #  user  system elapsed 
 # 0.226   0.133   0.358 
 mtx <- matrix(rnorm(43000*170), 170)
 system.time( mtx[ , 1:43000] <- ( mtx[ , 1:43000] < 
                                   rep( cutoff, 
                                          each=170 ) ) )
 #  user  system elapsed 
 # 0.852   0.001   0.849 
 #Now do it all at once............
 system.time( mtx <- mtx < rep( cutoff, each=170 ) ) 
  # user  system elapsed 
  #0.095   0.000   0.094 
于 2013-02-22T06:37:20.427 に答える