我有一个数据文件,我想读入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行!
我已经做了一些思考和研究,但似乎无法找到一种合理的方法来做到这一点。
据我所知,有两个问题:
如何阅读文件:有没有办法在R中的文件中移动指针?我曾经使用过的其他一些语言都有这种能力,在这种情况下我可以阅读第一行,阅读日期,看看我是否想要那个日期,然后如果没有跳过在结尾处列出的行数标题(最好不要读它们!)并读取下一个标题行。我在文档中看不到任何关于函数的内容,这些函数可以让我在不实际阅读的情况下执行此操作。似乎如果我手动创建一个连接对象,那将跟踪我在文件中的位置,并且我可以使用readLines(在循环中)的重复调用来读取文件的块,如果它们被读取则丢弃它们“不需要。
如何存储数据:理想情况下,我想在数据框中存储每个日期的2D数据集,然后我可以相当容易地继续对它们进行任何分析。但是,我应该如何存储这些2D数据集的负载?我正在考虑一个数据框列表,但这是最好的方法(就能够合理地索引列表而言)?
非常感谢任何想法或评论。
答案 0 :(得分: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()