Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在一个文件中建立一个唯一行的表,并记录观察到每个唯一行的次数_R_Bioinformatics - Fatal编程技术网

R 在一个文件中建立一个唯一行的表,并记录观察到每个唯一行的次数

R 在一个文件中建立一个唯一行的表,并记录观察到每个唯一行的次数,r,bioinformatics,R,Bioinformatics,我有一个DNA序列文件,file.txt,其中每一行都是一个DNA序列。前5行如下所示: GACAGAGGGTGCAAACGTTGTTCGGAATTACTGGGCGTAAAGCGCGTGTAGGCGGCCATGCAAGTCGGATGTGAAAGCCCTCGGCTCAACCGGGGAAGTGCACTCGAAACTGCAAGGCTAGAGTCTCGGAGAGGATCGTGGAATTCTCGGTGTAGAGGTGAAATTCGTAGATATCGAGAGGAACACCGGTGGCGAAGGCGGCGAT

我有一个DNA序列文件,
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命令行工具在优雅地使用时效率惊人”,但也许我也应该提到,要理解如何以“优雅”的方式使用它们,可能需要大量的接触/阅读——显然我也不例外。