Algorithm 寻找(L,t)-丛
我正试图在Clojure中找到丛。基本上,我需要找到所有出现在t次基因组中大小为L的窗口中的k长度子串。我已经实现了我认为解决方案是什么,但是我相信其中可能有缺陷,因为我用来确认的系统(beta.stepic.org)告诉我这一点。你们能看出我把事情搞砸了吗?我的解决方案如下,找到所有排名靠前的k-mers(k-length子串)并找到它们的起始索引。之后,我将其划分为t组,这意味着这是它们发生的次数,并且基本上对偏移量为k的已划分组中的最后一项和第一项进行了差异(因为所有k项都应适合于L窗口,这将通过扩展它来解释最后一个k项)。指数按升序排列。臭虫在哪里 团块查找问题:查找在字符串中形成团块的模式。 样本输入: 基因组:CGGACTCGACAGATGTGAAGAGAGACAGATGTGAAGCTCGACACAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAGAG 样本输出: CGACA砷化镓Algorithm 寻找(L,t)-丛,algorithm,clojure,bioinformatics,Algorithm,Clojure,Bioinformatics,我正试图在Clojure中找到丛。基本上,我需要找到所有出现在t次基因组中大小为L的窗口中的k长度子串。我已经实现了我认为解决方案是什么,但是我相信其中可能有缺陷,因为我用来确认的系统(beta.stepic.org)告诉我这一点。你们能看出我把事情搞砸了吗?我的解决方案如下,找到所有排名靠前的k-mers(k-length子串)并找到它们的起始索引。之后,我将其划分为t组,这意味着这是它们发生的次数,并且基本上对偏移量为k的已划分组中的最后一项和第一项进行了差异(因为所有k项都应适合于L窗口,
(defn获取索引[源目标]
“返回子字符串目标的索引
按升序在源中找到。这包括重叠。“
(让
[搜索(java.util.regex.Pattern/compile(str“(?=(“目标”))”)
匹配器(重新匹配器搜索源)
非零?(补零?)
(定义内部[匹配器]
(如果(不是零?(重新查找匹配者))
(cons(.start matcher)(内部匹配器)))
(内部匹配器)
(defn获得频繁kmer[来源k]
“从源获取大小为k的最频繁的k-mers”
(让[max val(val(应用max key val(频率(分区K1源))))]
(首先映射(过滤器#(=(val%)最大值)
(频率(map(部分应用str)(分区K1源()()()))))
(defn-find-clumps[基因组KLT]
(对于[k-mer(获取频繁的kmer基因组k)]
(让[索引(获取索引)k-mer)]
(如果(有些是真的)(map#)(除了代码样式有一些可以改进的地方外,我看到的主要问题是您在max key val
上过滤k-mers,而在初始过滤上根本没有考虑t
当您发现最常见的l-mers大小k
时,您只需保留较长的l-mers:
(apply max-key val (frequencies (partition k 1 source)))
因为你是按max val过滤的
(filter #(= (val %) max-val)
你只是在分析这些:
(for [k-mer (get-frequent-kmer genome k)]
问题是,如果t
为4,但有一些5-mers的重复次数超过4次,则将这些重复次数保留在等式之外。以下是一些工作代码:
(defn k-mers
"Returns a seq of all k-mers in text."
[k text]
(map #(apply str %) (partition k 1 text)))
(defn most-frequent-k-mers
"Returns a seq of k-mers in text appearing at least t times."
[k t text]
(->> (k-mers k text)
(frequencies)
(filter #(<= t (second %)))
(map first)))
(defn find-clump
"Finds k-mers forming (L, t) clumps in text."
[k L t text]
(let [windows (partition L 1 text)]
(->> windows
(map #(most-frequent-k-mers k t %))
(map set)
(apply clojure.set/union))))
(定义k-mers)
“返回文本中所有k-MER的序号。”
[正文]
(映射#(应用str%)(分区K1文本)))
(定义最频繁的k-mers)
“返回文本中出现至少t次的k-mers序列。”
[k t文本]
(->>(k-k文本)
(频率)
(过滤器#)(>窗口
(map#(最常见的k-mers k-t%))
(地图集)
(应用clojure.set/union)))
我想你应该从这里开始。“我需要找到在基因组中大小为L的窗口中出现t次的所有k长度子串”还不清楚——你的意思是“我需要找到在基因组中大小为L的窗口中至少出现t次的所有k长度子串”?根据您用来检查的系统,您期望的正确输出是什么?代码中有两个方面可以改进(例如在defn
中删除defn
)但是这些都不会改变你函数的行为。只有在发布这些信息并离开计算机后,我才意识到这一点。谢谢你确认我的信念。
(filter #(= (val %) max-val)
(for [k-mer (get-frequent-kmer genome k)]
(defn k-mers
"Returns a seq of all k-mers in text."
[k text]
(map #(apply str %) (partition k 1 text)))
(defn most-frequent-k-mers
"Returns a seq of k-mers in text appearing at least t times."
[k t text]
(->> (k-mers k text)
(frequencies)
(filter #(<= t (second %)))
(map first)))
(defn find-clump
"Finds k-mers forming (L, t) clumps in text."
[k L t text]
(let [windows (partition L 1 text)]
(->> windows
(map #(most-frequent-k-mers k t %))
(map set)
(apply clojure.set/union))))