【问题标题】:How to read very large files line by line matching patterns in R如何在R中逐行读取非常大的文件匹配模式
【发布时间】:2020-10-23 20:15:38
【问题描述】:

我至少需要在 R 中读取 10 GB 大小的文件。为了限制内存使用,我只想读取那些匹配模式的行。例如,在下面的文本文件mytext.tsv 中,我想从将成为标题的所需行中读取。然后从col2 中读取匹配codingsynonymous 的行,即patterns

patterns <- c("coding", "synonymous")

mytext.tsv:

## lines unwanted
## lines unwanted1
## lines unwanted2
## lines unwanted3
wanted  col1       col2    
aaa     variant1   coding
jhjh    variant2   non-coding
ggg     variant3   synonymous
fgg     variant4   coding
gdg     variant6   missense  

我预期的数据框应该是:

wanted  col1       col2    
aaa     variant1   coding
ggg     variant3   synonymous

我知道我可以使用连接和扫描然后循环遍历每个模式,但是在 R 中是否有任何有效的方法可以做到这一点?

我的实际数据示例:

【问题讨论】:

  • 最终您可以使用 awk、sed 或 PERL 进行预处理。
  • @jogo 是的,我想过,但很想知道它是否可以在 R 中完成。
  • 我猜这是一个 VCF 文件?也许 bcftools 更合适?
  • @zx8754 是的,它是VEP的输出。
  • 考虑添加VCF文件的例子和“生物信息学”标签,那么你可能会得到更多相关的答案。

标签: r bigdata bioinformatics


【解决方案1】:

data.tablecmd 选项和 grep 一起使用(未测试):

library(data.table)

fread(cmd = "grep 'coding\|synonymous' mytext.tsv",
      col.names = c("wanted", "col1", "col2"))

注意:

  • 这将适用于 *nix 系统。在 Windows 上,有一个 findstr 命令。
  • Regex 需要更新以适应您的数据。这只是一个示例,在 grep 搜索“编码”等时也会返回“非编码”行。

【讨论】:

  • @MAPK read the manuals for grep,它接受通常的正则表达式语法。或者使用regex 标签提出新问题。
  • 我只是在没有 col.names 的情况下使用它并且它有效:df <- fread(cmd=paste("grep", patterns, "mytext.tsv")).
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2011-12-22
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多