我的数据如下:
21 i=54,j=33, Y Component
250.04167175293 .486999988555908
250.08332824707 .541999995708466
250.125 .149000003933907
250.16667175293 .49099999666214
250.20832824707 .33899998664856
250.25 .31700000166893
250.29167175293 .36599999666214
250.33332824707 .204999998211861
250.375 .151999995112419
250.41667175293 9.70000028610229E-02
250.45832824707 -.115000002086163
250.5 -.170000001788139
250.54167175293 -.207000002264977
250.58332824707 -.230000004172325
250.625 -.231000006198883
250.66667175293 -.24099999666214
250.70832824707 -.229000002145767
250.75 -.190999999642372
250.79167175293 -.158999994397163
250.83332824707 -.101999998092651
250.875 0
21 i=55,j=33, Y Component
250.04167175293 .439999997615814
250.08332824707 .507000029087067
250.125 .148000001907349
250.16667175293 .453999996185303
250.20832824707 .316000014543533
250.25 .291999995708466
250.29167175293 .337999999523163
250.33332824707 .19200000166893
250.375 .141000002622604
250.41667175293 8.79999995231628E-02
250.45832824707 -.120999999344349
250.5 -.189999997615814
250.54167175293 -.23199999332428
250.58332824707 -.266999989748001
250.625 -.26800000667572
250.66667175293 -.275000005960464
250.70832824707 -.261999994516373
250.75 -.221000000834465
250.79167175293 -.175999999046326
250.83332824707 -.115000002086163
250.875 -1.20000001043081E-02
21 i=56,j=33, Y Component
250.04167175293 .439999997615814
250.08332824707 .507000029087067
250.125 .148000001907349
250.16667175293 .453999996185303
250.20832824707 .316000014543533
250.25 .291999995708466
250.29167175293 .337999999523163
250.33332824707 .19200000166893
250.375 .141000002622604
250.41667175293 8.79999995231628E-02
250.45832824707 -.120999999344349
250.5 -.189999997615814
250.54167175293 -.23199999332428
250.58332824707 -.266999989748001
250.625 -.26800000667572
250.66667175293 -.275000005960464
250.70832824707 -.261999994516373
250.75 -.221000000834465
250.79167175293 -.175999999046326
250.83332824707 -.115000002086163
250.875 -1.20000001043081E-02
21 i=57,j=33, Y Component
250.04167175293 .340999990701675
250.08332824707 .266999989748001
250.125 4.89999987185001E-02
250.16667175293 .273999989032745
250.20832824707 .172999992966652
250.25 .180999994277954
250.29167175293 .206000000238419
250.33332824707 .104000002145767
250.375 8.20000022649765E-02
250.41667175293 5.09999990463257E-02
250.45832824707 -8.50000008940697E-02
250.5 -.100000001490116
250.54167175293 -.123999997973442
250.58332824707 -.14300000667572
250.625 -.140000000596046
250.66667175293 -.144999995827675
250.70832824707 -.137999996542931
250.75 -.112000003457069
250.79167175293 -9.00000035762787E-02
250.83332824707 -5.60000017285347E-02
250.875 1.49999996647239E-02
在上面的数据集中,第一行给出了有关以下数据的信息:即21是数据点的数量,“i = 54,j = 33,Y Component”是列名。然后,在21行数据之后,格式继续。
我需要按如下方式转换数据:
time i=54,j=33, Y Component i=55,j=33, Y Component i=56,j=33, Y Component i=57,j=33, Y Component
1 250.0417 0.487 0.440 0.419 0.341
2 250.0833 0.542 0.507 0.476 0.267
3 250.1250 0.149 0.148 0.139 0.049
4 250.1667 0.491 0.454 0.431 0.274
5 250.2083 0.339 0.316 0.296 0.173
6 250.2500 0.317 0.292 0.270 0.181
我尝试使用grep查找模式然后合并它们,但似乎需要很长时间才能完成更大的数据集。我正在寻找一种更快的方式来阅读这种格式并安排数据。
答案 0 :(得分:2)
我使用scan
定义了几个函数来处理这个问题。我怀疑这不会非常快,但它会响应您拥有的数据格式。让我知道你的全尺寸数据集如何。请注意后处理以平滑结果。
定义的第一个函数readPairs
用时间和度量读取文件的一个块。它使用scan
从文件中读取此内容,并取2 * nPairs
个值。请注意,如果扫描时未指定分隔符,则会按空格分隔值。数据进入数据框架。
main函数定义要返回的数据帧。然后它打开与文件的连接。这是必要的,所以我们可以一次读取一些文件。每次新scan
调用使用连接时,连接对象都会保留文件中的位置。当到达文件的末尾时,返回零长度向量。这就是为什么while参数寻找的长度大于零。
在循环中,函数读取文件中的对数,然后是3个空格分隔的标签。它将这些传递给readPairs
,以便它读取正确的数字并将标记值附加到数据框。
readPairs <- function(connection, nPairs, tag){
pairVector <- scan(connection, what=numeric(), n = 2 * nPairs)
data.frame(
tag = rep(tag, nPairs),
time = pairVector[2 * seq_len(nPairs) - 1],
value = pairVector[2 * seq_len(nPairs)])
}
main <- function(textFile){
pairData <- data.frame(
tag = character(),
time = numeric(),
value = numeric())
connection <- file(textFile, "r")
#get the number of entries to read
pairs <- scan(connection, what=integer(), n = 1)
while(length(pairs) > 0){
#get the descriptive info [three whitespace delim strings]
desc <- paste(scan(connection, what=character(), n = 3), collapse = " ")
pairData <- rbind(pairData,
readPairs(connection, pairs, desc))
pairs <- scan(connection, what=integer(), n = 1)
}
close(connection)
pairData
}
pd <- main("filename.txt")
library(tidyr)
spread(pd,tag,value)