改组字符串(非随机)以获得最大差异

时间:2017-10-26 14:49:21

标签: r string shuffle

在网上尝试了一段令人尴尬的长时间搜索后,我遇到了一个问题。

我正在寻找一种方法(非随机)混乱一个字符串,以获得一个与原始字符串具有最大“距离”的字符串,同时仍包含相同的字符集。

我的特殊情况是短核苷酸序列(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)。当然,并不总是可以得到一个完全不同的字符串,但这些我只会在输出中标记。

我对序列的随机化并不特别感兴趣,并且更喜欢以一致的方式制作这些扰乱序列的方法。

你有什么想法吗?

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