R 在一个文件中建立一个唯一行的表,并记录观察到每个唯一行的次数
我有一个DNA序列文件,R 在一个文件中建立一个唯一行的表,并记录观察到每个唯一行的次数,r,bioinformatics,R,Bioinformatics,我有一个DNA序列文件,file.txt,其中每一行都是一个DNA序列。前5行如下所示: GACAGAGGGTGCAAACGTTGTTCGGAATTACTGGGCGTAAAGCGCGTGTAGGCGGCCATGCAAGTCGGATGTGAAAGCCCTCGGCTCAACCGGGGAAGTGCACTCGAAACTGCAAGGCTAGAGTCTCGGAGAGGATCGTGGAATTCTCGGTGTAGAGGTGAAATTCGTAGATATCGAGAGGAACACCGGTGGCGAAGGCGGCGAT
file.txt
,其中每一行都是一个DNA序列。前5行如下所示:
GACAGAGGGTGCAAACGTTGTTCGGAATTACTGGGCGTAAAGCGCGTGTAGGCGGCCATGCAAGTCGGATGTGAAAGCCCTCGGCTCAACCGGGGAAGTGCACTCGAAACTGCAAGGCTAGAGTCTCGGAGAGGATCGTGGAATTCTCGGTGTAGAGGTGAAATTCGTAGATATCGAGAGGAACACCGGTGGCGAAGGCGGCGATCTGGACGATGACTGACGCTGAGACGCGAAAGCGTGGGGAGCAAACAGG
TACGTAGGGTGCGAGCGTTAATCGGAATTACTGGGCGTAAAGCGTGCGCAGGCGGTCTCGTAAGCTGGGTGTGAAAGCCCCGGGCTTAACCTGGGAATGGCATTCAGGACTGCGAGGCTCGAGTGTGGCAGAGGGAGGTGGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAACACCGATGGCGAAGGCAGCCTCCTGGGCCAGCACTGACGCTCATGCACGAAAGCGTGGGGAGCAAACAGG
GACGTGTGAGGCAAGCGTTATTCGTCATTAATGGGTTTAAAGGGTACGTAGGCGGAATACTTTATTATGTTTAAGAAGACACTTAAAAGTGAACATGATAATAAAATTCTAGAGTTTGAAAGGAGTAAACAATTACCTCGAGAGTAAGGGACAACTAATACGGAAATACTTGGGGGGATTCTAAGCGGCGAAAGCATGTTACTATTGAAAACTGACGCTGAGGTACGAAGGCTTGGGTATCGACTGGG
TACGAAGGGTGCAAACGTTGCTCGGAATTATTGGGCGTAAAGCGCATGTAGGCGGCTTAGCAAGTCGGATGTGAAATCCCTCGGCTCAACCAAGGAAGTGCATCCGAAACTGCTGAGCTTGAGTACGAAAGAGGATCGCGGAATTCCCGGTGTAGAGGTGAAATTCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCGATCTGGGTCGATACTGACGCTGAGGTGCGAAAGCGTGGGGAGCAAACAGG
AACGTAGGAGACAAACGTTATCCGGAGTTACTGGGCGTAAAGGGCGTGTAGGTGGTTGCGTAAGTCTGGCGTGAAATTTTTCGGCTTAACCGGGAAAGGTCGTCGGATACTGCGTAGCTAGAGGACGGTAGAGGCGTGTGGAATTCCGGGGGTAGTGGTGAAATGCGTAGAGATCCGGAGGAACACCAGTGGCGAAGGCGACACGCTGGGCCGTACCTGACACTGATGCGCGACAGCATGGGGAGCAAACACT
data <- c("GACAGAG", "TACGTAGG", "AACGTAGG", "GACGTGTG", "TACGAAGG", "AACGTAGG")
ans <- table(data)
ans["AACGTAGG"]
实际文件包含数万行。我想确定该文件中的所有唯一序列(或唯一行)以及在该文件中观察到每个序列(或行)的次数。理想情况下,这将作为一个矩阵返回,在R中有一列,其中条目是序列丰度,行名是唯一序列
或者,这可以写入.csv
文件,其中第一行是由唯一序列(行)组成的逗号分隔字符串,第二行是由文件中每个序列出现次数的逗号分隔字符串
第二,这个文件很大(~5MB),但是有很多类似的文件。在下游,我必须将这些向量合并在一起。如何在最小化内存使用的同时生成此向量?编辑
我不知道Unix的答案是允许的。因此,下面是两种选择sort | uniq
答案的方法。考虑到您的文件位于同一文件夹中,名为myFile\u 1.txt myFile\u 2.txt myFile\u n.txt
find . -type f -name 'testtext*' | xargs sort | uniq -c > Counts.txt
10 a
6 b
5 c
3 d
1 e
1 f
测试中最好的700k线路160Mb:
perl -ne '$count{$_}++; END { print "$count{$_} $_" for sort {$count{$b} <=> $count{$a} || $b cmp $a} keys %count}' myFile*.txt > output.txt
可以找到更详细的解释
先前的R答案
您可以将数据放入如下向量结构中:
GACAGAGGGTGCAAACGTTGTTCGGAATTACTGGGCGTAAAGCGCGTGTAGGCGGCCATGCAAGTCGGATGTGAAAGCCCTCGGCTCAACCGGGGAAGTGCACTCGAAACTGCAAGGCTAGAGTCTCGGAGAGGATCGTGGAATTCTCGGTGTAGAGGTGAAATTCGTAGATATCGAGAGGAACACCGGTGGCGAAGGCGGCGATCTGGACGATGACTGACGCTGAGACGCGAAAGCGTGGGGAGCAAACAGG
TACGTAGGGTGCGAGCGTTAATCGGAATTACTGGGCGTAAAGCGTGCGCAGGCGGTCTCGTAAGCTGGGTGTGAAAGCCCCGGGCTTAACCTGGGAATGGCATTCAGGACTGCGAGGCTCGAGTGTGGCAGAGGGAGGTGGAATTCCACGTGTAGCAGTGAAATGCGTAGAGATGTGGAGGAACACCGATGGCGAAGGCAGCCTCCTGGGCCAGCACTGACGCTCATGCACGAAAGCGTGGGGAGCAAACAGG
GACGTGTGAGGCAAGCGTTATTCGTCATTAATGGGTTTAAAGGGTACGTAGGCGGAATACTTTATTATGTTTAAGAAGACACTTAAAAGTGAACATGATAATAAAATTCTAGAGTTTGAAAGGAGTAAACAATTACCTCGAGAGTAAGGGACAACTAATACGGAAATACTTGGGGGGATTCTAAGCGGCGAAAGCATGTTACTATTGAAAACTGACGCTGAGGTACGAAGGCTTGGGTATCGACTGGG
TACGAAGGGTGCAAACGTTGCTCGGAATTATTGGGCGTAAAGCGCATGTAGGCGGCTTAGCAAGTCGGATGTGAAATCCCTCGGCTCAACCAAGGAAGTGCATCCGAAACTGCTGAGCTTGAGTACGAAAGAGGATCGCGGAATTCCCGGTGTAGAGGTGAAATTCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCGATCTGGGTCGATACTGACGCTGAGGTGCGAAAGCGTGGGGAGCAAACAGG
AACGTAGGAGACAAACGTTATCCGGAGTTACTGGGCGTAAAGGGCGTGTAGGTGGTTGCGTAAGTCTGGCGTGAAATTTTTCGGCTTAACCGGGAAAGGTCGTCGGATACTGCGTAGCTAGAGGACGGTAGAGGCGTGTGGAATTCCGGGGGTAGTGGTGAAATGCGTAGAGATCCGGAGGAACACCAGTGGCGAAGGCGACACGCTGGGCCGTACCTGACACTGATGCGCGACAGCATGGGGAGCAAACACT
data <- c("GACAGAG", "TACGTAGG", "AACGTAGG", "GACGTGTG", "TACGAAGG", "AACGTAGG")
ans <- table(data)
ans["AACGTAGG"]
data您应该使用HashMap,序列是键,值是计算出现次数的整数
java伪代码中的算法如下,读取行直到EOF
Map<String, Integer> map = new Map...
String line;
Integer appearances;
while(not EOF)
line = read line however suits your problem
appearances = map.get(line)
if(appearances == null)
map.put(line, 1)
else
map.put(line, appearances+1)
Map Map=新映射。。。
弦线;
整数外观;
while(非EOF)
行=读取行,但适合您的问题
外观=map.get(行)
if(外观==null)
地图放置(第1行)
其他的
地图放置(线条、外观+1)
然后,您可以通过查询map键集并执行get或仅使用entryset来访问所有已创建的行及其值
关于效率,您可能无法找到比以这种方式使用字典更有效的方法。您正在使用Unix系统吗?(此答案在开箱即用的Windows上不起作用)
我创建了一个名为testtext.txt
的文件,其内容如下:
c
a
b
a
b
b
b
c
然后在终端中执行以下命令
sort testtext.txt | uniq -c > testcounts.txt
生成一个包含以下内容的文件,testcounts.txt
2 a
4 b
2 c
我不能说相对于其他解决方案,这将如何执行,但似乎值得一试
您还可以在与当前目录中的模式匹配的所有文件中同时执行此操作-我制作了三个-testtext.txt
,testtext2.txt
,和testtext3.txt
find . -type f -name 'testtext*' | xargs sort | uniq -c > Counts.txt
10 a
6 b
5 c
3 d
1 e
1 f
然后创建文件Counts.txt
find . -type f -name 'testtext*' | xargs sort | uniq -c > Counts.txt
10 a
6 b
5 c
3 d
1 e
1 f
或者(特别是在关注内存使用的情况下),您可以将单个文件示例放在一个简单的bash脚本for循环中,一次处理一个文件无论哪种方式,Unix命令行工具都可以优雅地使用。
信用:在上,仅使用R base命令比较500000行数据的结果:
这是我们的测试文件,500K行,122MB
wc -l myFile.txt
# 500000 myFile.txt
ls -lh myFile.txt
# xxx xxx xxx xxx 122M May 10 09:05 myFile.txt
使用排序| uniq
:
time sort myFile.txt | uniq -c > myFileCounts1.txt
# real 0m7.317s
# user 0m12.998s
# sys 0m0.228s
使用R,表
():
我将如何在终端或R中实现这一点?这是关于hashmap数据结构的文档,可能是?呃,它用问号表示“可能”。Post用R标记。有些包不会阻塞内存。您是否尝试使用表(myvector)?无需将所有文件同时放入R、读取一个、获取计数、输出、删除对象等。@tk3我认为标记应该保留,这是相关的。@zx8754我不认为这与您链接的问题是直接重复的。在bash
/linux
标签或本网站其他地方可能有一些更接近的重复项。在这一点上,听起来好像@colin仍然需要一些额外的答案,他可以进行一些编辑,明确指出所需的解决方案不需要是r
,它需要处理不适合内存的文件。添加一些相关的标记,如bash
,linux
等,可能是有意义的,但我同意R
应该保留,以防有人用@colin的首选语言提出解决方案。@colin建议重复并不是为了伤害你,相反。通常,受骗目标已经有了答案,并且它与其他类似的问题相关联,这些问题也被当作受骗者关闭。因此,您不需要等待。这也是SO的政策,这也是SO给予zx8754权力,如果他愿意的话,可以轻松解决这个问题的原因,所以请不要大吵大闹。还有最后一件事,一个旨在为所有人服务的问答网站也是如此,它不是你的私人助理。以重复方式结束的想法是,未来的读者可以找到尽可能多的相关答案。不需要cat
。谢谢@zx8754,更新以反映。我提到“Unix命令行工具在优雅地使用时效率惊人”,但也许我也应该提到,要理解如何以“优雅”的方式使用它们,可能需要大量的接触/阅读——显然我也不例外。