Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Scala 函数在遍历字符串kmer count时返回映射列表_Scala - Fatal编程技术网

Scala 函数在遍历字符串kmer count时返回映射列表

Scala 函数在遍历字符串kmer count时返回映射列表,scala,Scala,我正在创建一个用Scala编写的k-mer频率计数器(类似于Hadoop中的字数计数)。我对Scala相当陌生,但我有一些编程经验 输入是一个包含基因序列的文本文件,我的任务是获取每个k-mer的频率,其中k是序列的某个指定长度 因此,序列AGCTTTTC有三个5-mers(AGCTT、GCTTT、CTTTC) 我已经解析了输入,并创建了一个巨大的字符串,它是整个序列,新行摆脱了k-mer计数,因为一行序列的结尾仍然应该与下一行序列的开头形成一个k-mer 现在,我正在尝试编写一个函数,该函数将

我正在创建一个用Scala编写的k-mer频率计数器(类似于Hadoop中的字数计数)。我对Scala相当陌生,但我有一些编程经验

输入是一个包含基因序列的文本文件,我的任务是获取每个k-mer的频率,其中
k
是序列的某个指定长度

因此,序列
AGCTTTTC
有三个5-mers(AGCTT、GCTTT、CTTTC)

我已经解析了输入,并创建了一个巨大的字符串,它是整个序列,新行摆脱了k-mer计数,因为一行序列的结尾仍然应该与下一行序列的开头形成一个k-mer

现在,我正在尝试编写一个函数,该函数将生成一个映射列表
list[Map[String,Int]]
,使用scala的
groupBy
函数可以很容易地获得常见k-mers的计数

import scala.io.Source

object Main {
  def main(args: Array[String]) {

    // Get all of the lines from the input file
    val input = Source.fromFile("input.txt").getLines.toArray

    // Create one huge string which contains all the lines but the first
    val lines = input.tail.mkString.replace("\n","")

    val mappedKmers: List[Map[String,Int]] = getMappedKmers(5, lines)

  }

  def getMappedKmers(k: Int, seq: String): List[Map[String, Int]] = {
    for (i <- 0 until seq.length - k) {
      Map(seq.substring(i, i+k), 1) // Map the k-mer to a count of 1
    }
  }
}
导入scala.io.Source
对象主体{
def main(参数:数组[字符串]){
//从输入文件中获取所有行
val input=Source.fromFile(“input.txt”).getLines.toArray
//创建一个巨大的字符串,其中包含除第一行以外的所有行
val lines=input.tail.mkString.replace(“\n”,”)
val mappedKmers:List[Map[String,Int]=getMappedKmers(5行)
}
def getMappedKmers(k:Int,seq:String):List[Map[String,Int]={

对于(i),您的代码有三个相当小的问题

第一个是
for(i foo(i))
,这意味着您实际上没有对
的内容做任何事情,不管它是什么。您想要的是
for(i foo(i))
,并返回转换后的集合

第二个问题是
0直到seq.length-k
是一个
范围,而不是
列表,因此即使添加了
收益率
,结果仍然不会与声明的返回类型一致

第三个问题是
Map(k,v)
试图创建一个包含两个键值对的映射,
k
v
。您需要
Map(k->v)
Map((k,v))
,这两个映射都明确表示您有一个参数对

因此,以下措施应该有效:

def getMappedKmers(k: Int, seq: String): IndexedSeq[Map[String, Int]] = {
  for (i <- 0 until seq.length - k) yield {
    Map(seq.substring(i, i + k) -> 1) // Map the k-mer to a count of 1
  }
}

我绝对建议使用类似于
“agcttc”.slideing(5).toList.groupBy(identity)
的方法来获取真正的代码。

为什么要将每个kmer映射为
1
?它看起来可能只是一个kmer,因此返回的类型可能只是
List[String]
。因此,我建议的代码只是
seq slided k toList
。好的一点是,我实际上在一分钟前就尝试做了类似的事情。
1
之所以存在,是因为我试图使这段代码适应hadoop MapReduce作业中的字数计算方式,其中每个键都映射为1,而reduce函数ion累计每个钥匙的总数(在本例中为公里数)
scala> "AGCTTTC".sliding(5).foreach(println)
AGCTT
GCTTT
CTTTC