1

我正在尝试将数据框从 R 转换为文本文件。

数据集约为 1500 x 700,循环遍历数据帧需要一段时间,我想知道是否有任何方法可以加快该过程。

我的数据框是这样的:

>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

尝试按如下方式对操作进行矢量化(我将“分数”放在一个单独的变量中,并将其从“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 回答