【问题标题】:R convert data frame to input file - improve performanceR将数据帧转换为输入文件-提高性能
【发布时间】:2012-08-13 18:59:44
【问题描述】:

我正在尝试将数据框从 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")

【问题讨论】:

  • collect1 预分配到正确的长度可以节省大量时间。而且您只是打印到控制台,而不是创建文本文件。

标签: r loops hash


【解决方案1】:

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

【讨论】:

  • 太棒了!运行大约 15 秒。非常感谢!
猜你喜欢
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2019-12-13
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多