在网上尝试了一段令人尴尬的长时间搜索后,我遇到了一个问题。
我正在寻找一种方法(非随机)混乱一个字符串,以获得一个与原始字符串具有最大“距离”的字符串,同时仍包含相同的字符集。
我的特殊情况是短核苷酸序列(4-8个核苷酸长),如这些实例序列所示:
seq_1<-"ACTG"
seq_2<-"ATGTT"
seq_3<-"ACGTGCT"
对于每个序列,我想获得一个包含相同核碱基计数的争夺序列,但顺序不同。
seq_3的有利扰乱序列可能类似于;
seq_3.scramble<-"CATGTGC"
,其中序列位置1-7没有一个具有相同的核碱基,但总核碱基计数相同(A = 1,C = 2,G = 2,T = 2)。当然,并不总是可以得到一个完全不同的字符串,但这些我只会在输出中标记。
我对序列的随机化并不特别感兴趣,并且更喜欢以一致的方式制作这些扰乱序列的方法。
你有什么想法吗?
答案 0 :(得分:1)
python,因为我不知道r,但基本解决方案如下
def calcDistance(originalString,newString):
d = 0
i=0
while i < len(originalString):
if originalString[i] != newString[i]: d=d+1
i=i+1
s = "ACTG"
d_max = 0
s_final = ""
for combo in itertools.permutations(s):
if calcDistance(s,combo) > d_max:
d_max = calcDistance(s,combo)
s_final = combo
答案 1 :(得分:1)
试一试。我返回一个按字符串距离得分排序的所有字符串的数据框,而不是返回符合条件的单个字符串。字符串距离分数使用stringdist(..., ..., method=hamming)
计算,它确定将字符串A转换为B所需的替换次数。
seq_3<-"ACGTGCT"
myfun <- function(S) {
require(combinat)
require(dplyr)
require(stringdist)
vec <- unlist(strsplit(S, ""))
P <- sapply(permn(vec), function(i) paste(i, collapse=""))
Dist <- c(stringdist(S, P, method="hamming"))
df <- data.frame(seq = P, HD = Dist, fixed=TRUE) %>%
distinct(seq, HD) %>%
arrange(desc(HD))
return(df)
}
library(combinat)
library(dplyr)
library(stringdist)
head(myfun(seq_3), 10)
# seq HD
# 1 TACGTGC 7
# 2 TACGCTG 7
# 3 CACGTTG 7
# 4 GACGTTC 7
# 5 CGACTTG 7
# 6 CGTACTG 7
# 7 TGCACTG 7
# 8 GTCACTG 7
# 9 GACCTTG 7
# 10 GATCCTG 7