【问题标题】:Crafty ways to make super efficient R vector processing?制作超高效 R 矢量处理的巧妙方法?
【发布时间】:2016-06-03 08:33:57
【问题描述】:

我有一个非常简单的任务,需要处理大量信息;我教授的第一句话是“这需要一段时间才能运行”,所以我认为这是一个很好的机会,可以花时间运行我的程序来制作一个超级高效的程序: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
...

所以,如您所见,我想要节点名称、值和值行的第三列。我已经使用一个超慢的 for 循环来实现它,该循环使用 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 的行数的最大节点线。有什么想法吗?

【问题讨论】:

  • strsplit 是矢量化的。您不应该在每个“val”行上运行它。您可以将它作为一个块在整个向量上运行。
  • 你必须在 R 中做这个数据转换吗?因为awk 实用程序可以在命令行上快速完成...
  • 这里是 awk 版本:awk '$0~"^#"{sub("_[0-9]*\\.[0-9]*\\.[0-9]*","",$0);V=substr($0,2,9999)};$0!~"^#"{print V,$1,$3}' &lt; shape.txt;如果该行以# 开头,则更新当前V,去掉# 和虚线数字,否则使用当前V 值打印第一个和第三个字段。

标签: r performance optimization vector


【解决方案1】:

我建议使用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]

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多