1

データフレームをRからテキストファイルに変換しようとしています。

データセットは約1500x700で、データフレームをループするのに時間がかかります。プロセスを高速化する方法があるかどうか疑問に思っています。

私のデータフレームは次のようなものです。

>train2
score   x1    x2    x3     x4     x5 ...  x700
  0     0      1     1      1     0        0
  1     0      1     0      0     0        0
  0     1      0     1      1     1        0
  3     0      1     1      1     0        0
  1     0      1     0      1     0        0
  2     1      1     1      1     0        1
  0     0      1     1      0     0        0
 ...    .      .     .      .     .        .

作成されたファイルには、ゼロ以外のセルのみが含まれています。

したがって、行1〜3の出力は次のようになります。

0 | x2:1 x3:1 x4:1
1 | x2:1
0 | x1:1 x3:1 x4:1

私の現在のコードは次のように実行されます:

pt1 <- paste(train2$score," | ",sep="")
  collect1 <- c()
  for(j in 1:nrow(train2)){
    word1 <- pt1[j]
    for(i in 10:ncol(train2)){
      if(train2[j,i] !=0){
        word1 <- paste(word1,colnames(train2)[i],":",train2[j,i], " ", sep="")                        
      }      
    }  
    collect1 <- c(collect1, word1)
    if(j %% 100 == 0){
      print(j);flush.console()    
      gc()
    }    
  }

各実行には約3〜4分かかります。パフォーマンスを改善するために明らかなことはありますか?

編集:ループが完了した後、結果のデータフレームcollect1は、以下を使用してテキストファイルを作成するために使用されます。

  write(collect1, file="outPut1.txt")
4

1 に答える 1

4

次のように操作をベクトル化してみてください(「score」を別の変数に入れ、「train3」から削除したので、無名関数でデータフレームをサブセット化する必要はありません):

score  <- train2$score
train3 <- train2[, -1]
cols   <- colnames(train3)
res <- apply(train3, 1, function(x) {
  idx  <- x != 0
  nms  <- cols[idx]
  vals <- x[idx]
  paste(nms, vals, sep=":", collapse=" ")
})

out <- paste(score, "|", as.vector(res))
print(out)
于 2012-08-13T20:11:56.213 に答える