【发布时间】: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}' < shape.txt;如果该行以#开头,则更新当前V,去掉#和虚线数字,否则使用当前V值打印第一个和第三个字段。
标签: r performance optimization vector