在R中有效地读取堆叠数据集

时间:2015-03-24 16:39:22

标签: r grep

我的数据如下:

 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查找模式然后合并它们,但似乎需要很长时间才能完成更大的数据集。我正在寻找一种更快的方式来阅读这种格式并安排数据。

1 个答案:

答案 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)