3

我有一个数据文件,我想读入 R,它类似于以下内容:

STARTOFDATA 2011-06-23 35
143 6456 23 646 123.53A 864.95 23B
343 634 24 545 65.3 235.2 94C
...
524 542 45 245.4 24 245A 45B
STARTOFDATA 2011-06-24 84
245 6532 24.4 624.2 542 23B 35A
241 4532 13.5 235.12 534.23 54 32B
etc...

如您所见,它基本上是一个 2D 数据集(标题行之间的每一列都是不同的变量),它存储了多个日期,由STARTOFDATA行指定,这些日期将不同的日期分开。标题行末尾的数字是下一个标题行之前的数据行数。A、B 和 C 等是质量控制信息,基本上可以丢弃 - 可能就像gsub我从文件中获得的文本一样。

我的问题是:我应该如何将其读入 R?理想情况下,我希望能够读取整个文件或指定的日期(或日期范围)。我可能应该指出该文件超过 200,000 行!

我已经对此进行了一些思考和研究,但似乎无法找到一种明智的方法来做到这一点。

据我所知,有两个问题:

  1. 如何读取文件:有没有办法在 R 的文件中移动指针?我使用过的其他一些语言也有这种能力,在这种情况下,我可以阅读第一行,阅读日期,看看我是否想要那个日期,然后如果不跳过最后列出的行数标题(最好不要阅读它们!)并阅读下一个标题行。我在文档中看不到任何关于可以让我在不实际阅读行的情况下做到这一点的功能。似乎如果我手动创建一个连接对象,那么它将跟踪我在文件中的位置,并且我可以使用对 readLines 的重复调用(在循环中)来读取文件的块,如果它们一旦读取就丢弃它们'不需要。

  2. 如何存储数据:理想情况下,我想将每个日期的 2D 数据集存储在数据框中,然后我可以继续相当轻松地对它们进行任何分析。但是,我应该如何存储这些 2D 数据集的负载?我正在考虑一个数据框列表,但这是最好的方法(就能够明智地索引列表而言)?

任何想法或意见将不胜感激。

4

1 回答 1

6

用于readLines将数据读取为字符向量,然后操作此向量。以下是将您的示例数据拆分为块列表的一些代码:

用于readLines读取数据:

x <- readLines(textConnection(
"STARTOFDATA 2011-06-23 35
143 6456 23 646 123.53A 864.95 23B
343 634 24 545 42 65.3 235.2 94C
...
524 542 45 245.4 24 542.54 245A 45B
STARTOFDATA 2011-06-24 84
245 6532 24.4 624.2 542 23B 35A
241 4532 13.5 235.12 534.23 54
etc..."))

确定 的位置STARTOFDATA,然后拆分为块列表:

positions <- c(grep("STARTOFDATA", x), length(x)+1)
lapply(head(seq_along(positions), -1), 
       function(i)x[positions[i]:(positions[i+1]-1)])

[[1]]
[1] "STARTOFDATA 2011-06-23 35"          
[2] "143 6456 23 646 123.53A 864.95 23B" 
[3] "343 634 24 545 42 65.3 235.2 94C"   
[4] "..."                                
[5] "524 542 45 245.4 24 542.54 245A 45B"

[[2]]
[1] "STARTOFDATA 2011-06-24 84"      
[2] "245 6532 24.4 624.2 542 23B 35A"
[3] "241 4532 13.5 235.12 534.23 54" 
[4] "etc..."  

现在每个数据块都是列表中的一个元素,您可以根据需要使用第二个lapply()

于 2012-07-07T20:03:44.673 回答