狡猾的方法来进行超高效的R矢量处理?

时间:2016-02-22 02:16:30

标签: r performance optimization vector

我对一个需要处理大量信息的项目进行了非常简单的分配;我教授的第一句话是#34;这需要一段时间才能运行"所以我认为这是一个很好的机会,花时间我会运行我的程序制作一个超级高效的程序:P

基本上,我有一个输入文件,其中每一行都是节点或细节。它可能看起来像:

#NODE1_length_17_2309482.2394832.2
val1    5     18
val2    6     21
val3    100   23
val4    9     6
#NODE2_length_1298_23948349.23984.2
val1    2    293
...

等等。基本上,我想知道如何有效地使用R来逐行输出,例如:

NODE1_length_17   val1   18
NODE1_length_17   val2   21
...

因此,正如您所看到的,我想要节点名称,值和值行的第三列。我已经使用一个使用strsplit的超慢循环来实现它,很明显这并不理想。我目前的实现如下:

   nodevals <- which(substring(data, 1, 1) == "#") # find lines with nodes
   vallines <- which(substring(data, 1, 3) == "val")
   out <- vector(mode="character", length=length(vallines))
   for (i in vallines) {

      line_ra <- strsplit(data[i], "\\s+")[[1]]
      ... and so on using a bunch of str splits and pastes to reformat
      out[i] <- paste(node, val, value, sep="\t")
   }

有人知道如何使用数据框架或狡猾的矢量操作来优化它吗?

编辑:我实施了vecor明智的分裂,到目前为止,我发现我能够正确分割的主要内容是每个节点的名称。我试图做点什么,

names <- data[max(nodes[nodelines < vallines])]

其中节点是包含节点的每一行的名称,而vallines是包含val的每行的编号。返回向量应具有与vallines相同数量的元素。目标是找到小于每个vallines的vallines行数的最大节点行。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我建议使用data.table包 - 它具有非常快的字符串拆分功能tstrsplit

library(data.table)

#read from file
data <- scan('data.txt', 'character', sep = '\n')

#create separate objects for nodes and values
dt <- data.table(data)
dt[, c('IsNode', 'NodeId') := list(IsNode <- substr(data, 1, 1) == '#', cumsum(IsNode))]
nodes <- dt[IsNode == TRUE, list(NodeId, data)]
values <- dt[IsNode == FALSE, list(data, NodeId)]

#split string and join back values and nodes
tmp <- values[, tstrsplit(data, '\\s+')]
values <- data.table(values[, list(NodeId)], tmp[, list(val = V1, value = V3)], key = 'NodeId')
res <- values[nodes]