所以我得到了一个数据文件(分号分隔) ,它有很多细节和不完整的行(导致 Access 和 SQL 无法使用)。它的县级数据集被分成片段、子片段和子片段(总共约200个因子) ,历时40年。简而言之,它是巨大的,如果我只是简单地阅读它,它是不会进入记忆的。
所以我的问题是,考虑到我想要所有的县,但只有一年(只是最高级别的段... 导致大约100,000行的最后) ,什么是最好的方式去得到这个汇总到 R?
目前,我正在尝试用 Python 省去不相关的时间,通过一次读取和操作一行文件来绕过文件大小限制,但是我更喜欢只使用 R 的解决方案(CRAN 包 OK)。在 R 语言中是否有类似的方法一次读取一段文件?
有任何想法都会很感激。
更新:
数据例子:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
我想剪掉一些栏目,从40个可用年份(2009-2010年和1980-2020年)中挑出两个,这样数据就可以适合 R:
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
结果:
在修改了所有提出的建议之后,我决定使用 JD 和 Marek 提出的 readLines 最好。我给 Marek 支票是因为他给了一个实现示例。
我在这里复制了一个稍微修改过的 Marek 实现版本作为我的最终答案,使用 strsplit 和 cat 只保留我想要的列。
还应该注意的是,很多的效率低于 Python... ... 就像 Python 在5分钟内处理3.5 GB 的文件,而 R 大约需要60... ... 但是如果你只有 R,那么这就是代价。
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
方法上的失误: