我对一个需要处理大量信息的项目进行了非常简单的分配;我教授的第一句话是#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行数的最大节点行。有什么想法吗?
答案 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]