【问题标题】:R: filter a vector of words by letter disimilarityR:按字母差异过滤单词向量
【发布时间】:2021-07-27 11:30:21
【问题描述】:

我正在使用以下命令创建一个单词向量:

DNA <- c("A","G","T","C")
randomDNA <- c()

for (i in 1:96){
  randomDNA[i] <- paste0(sample(DNA, 6, replace = TRUE), sep = "", collapse = "")
}

这将创建一个包含 96 个元素的向量。包含 A、T、C、G 的单词。 我该怎么做:

A. 在循环中插入一个条件,该条件将保持彼此之间至少有 3 个差异的单词,保持向量的大小不变?

B. 做同样的事情,但删除相同单词的重复。 谢谢大家

【问题讨论】:

    标签: r vector conditional-statements


    【解决方案1】:

    更新

    根据您对Hamming distance 的尝试,您可以尝试以下代码

    Humm_gt3 <- DNAall[1]
    for (i in 2:length(DNAall)) {
      split_vector <- strsplit(DNAall[i], "")[[1]]
      flag_gt3 <- TRUE
      for (j in 1:length(Humm_gt3)) {
        split_vector2 <- strsplit(Humm_gt3[j], "")[[1]]
        flag_gt3 <- flag_gt3 & (sum(split_vector != split_vector2) >= 3)
      }
      if (flag_gt3) Humm_gt3 <- c(Humm_gt3, DNAall[i])
    }
    

    或更轻的版本(更高效)

    Humm_gt3 <- DNAall[1]
    for (i in DNAall[-1]) {
      v <- utf8ToInt(i)
      flag_gt3 <- TRUE
      for (j in Humm_gt3) {
        if (sum(v != utf8ToInt(j)) < 3) {
          flag_gt3 <- FALSE
          break
        }
      }
      if (flag_gt3) Humm_gt3 <- c(Humm_gt3, i)
    }
    

    给了

    > Humm_gt3
     [1] "AAAAAA" "GGGAAA" "TTTAAA" "CCCAAA" "TGAGAA" "CAGGAA" "ACTGAA" "GTCGAA"
     [9] "CTATAA" "TCGTAA" "GATTAA" "AGCTAA" "GCACAA" "ATGCAA" "CGTCAA" "TACCAA"
    [17] "CGAAGA" "TAGAGA" "GCTAGA" "ATCAGA" "GAAGGA" "AGGGGA" "CTTGGA" "TCCGGA"
    [25] "ACATGA" "GTGTGA" "TGTTGA" "CACTGA" "TTACGA" "CCGCGA" "AATCGA" "GGCCGA"
    [33] "GTAATA" "ACGATA" "CATATA" "TGCATA" "CCAGTA" "TTGGTA" "GGTGTA" "AACGTA"
    [41] "TAATTA" "CGGTTA" "ATTTTA" "GCCTTA" "AGACTA" "GAGCTA" "TCTCTA" "CTCCTA"
    [49] "TCAACA" "CTGACA" "AGTACA" "GACACA" "ATAGCA" "GCGGCA" "TATGCA" "CGCGCA"
    [57] "GGATCA" "AAGTCA" "CCTTCA" "TTCTCA" "CAACCA" "TGGCCA" "GTTCCA" "ACCCCA"
    

    上一个答案

    1. 您可以尝试使用expand.grid 构建DNA 的所有组合,即DNAall,如下所示
    DNAall <- do.call(paste0, expand.grid(rep(list(DNA), 6)))
    
    1. 然后,您可以使用for 循环和adist 选择与DNA_gt3 中所有其他选定序列具有距离&gt;=3 的DNA 序列
    DNA_gt3 <- DNAall[1]
    for (dna in DNAall[-1]) {
      if (all(adist(dna, DNA_gt3) >= 3)) DNA_gt3 <- c(DNA_gt3, dna)
    }
    
    1. 最后,您将获得一整套DNA,它们在DNA_gt3中的任何一对之间至少有3个距离,即,
    > DNA_gt3
     [1] "AAAAAA" "GGGAAA" "TTTAAA" "CCCAAA" "TGAGAA" "CAGGAA" "ACTGAA" "GTCGAA"
     [9] "CTATAA" "GATTAA" "GCACAA" "TACCAA" "CGAAGA" "GCTAGA" "ATCAGA" "AGGGGA"
    [17] "TATGGA" "GTGTGA" "TCCTGA" "TTACGA" "CCGCGA" "GGCCGA" "GTAATA" "TGCATA"
    [25] "CCAGTA" "AACGTA" "TAGTTA" "CGTTTA" "ATTCTA" "TCAACA" "AGTACA" "GCGGCA"
    [33] "CTTGCA" "GGATCA" "CACTCA" "AAGCCA" "AGCAAG" "TCGGAG" "ATGTAG" "CCTTAG"
    [41] "GTTCAG" "GAAAGG" "TTGAGG" "ATAGGG" "GGTGGG" "CACGGG" "AATTGG" "TCTCGG"
    [49] "AAGATG" "CTCATG" "CGGGTG" "TTTGTG" "GCCGTG" "TGATTG" "CAACTG" "TACACG"
    [57] "GAGTCG" "ACCTCG" "AGACCG" "CTGCCG" "CGTGAT" "AGATAT" "GCCTAT" "GAGCAT"
    [65] "ATCCAT" "CAGAGT" "TGCGGT" "TAATGT" "CTTCGT" "ACAATT" "GGTATT" "GAAGTT"
    [73] "ATGGTT" "TCTTTT" "CCCCTT" "TGGACT" "GTCACT" "TTAGCT" "CCATCT" "CGGTAC"
    [81] "ACGCAC" "TCAGGC" "GAGGGC" "AGCTGC" "AAACGC" "TGGCGC" "TAAATC" "CATGTC"
    [89] "ATATTC" "GCGTTC" "TTCCTC" "CTAACC" "GATACC" "CGCGCC" "TTGTCC" "CCTCCC"
    

    为了你的第二个目标

    由于DNA_gt3是一个完整的集合,如果你想查看randomDNA中有哪些独特的元素属于这个集合,你可以使用

    unique(randomDNA[randomDNA %in% DNA_gt3])
    

    【讨论】:

    • 感谢您的回答。我对距离的实现来自以下代码,是否可以使用该代码代替 adist?实际上这并不重要,但我想使用相同的方法?:for (i in 1:length(DNA_gt3)){ split_vector &lt;- strsplit(DNA_gt3[i], "")[[1]] for (j in 1:length(DNA_gt3)){ split_vector2 &lt;- strsplit(DNA_gt3[j], "")[[1]] #Hamming distance is calculated as: Humm[i,j] &lt;- sum(split_vector != split_vector2) } }
    • @sunta3iouxos 是的,我认为汉明距离也适用于此。关键是如何确保任何一对之间的距离,它应该适用于任何其他类型的距离测量。
    • 在您的代码中,您询问循环“dna”与不断增长的“DNA_gt3”向量中的每个条目。 adist() 以向量 Vs 向量方式运行良好。 Hamming(我的实现)以元素与元素的方式工作。 但是我不能让它工作(在嵌套的 for 循环中不好)。以下内容效果不佳。for (i in 1:length(DNAall)) { split_vector &lt;- strsplit(DNAall[i], "")[[1]] for (j in 1:length(DNAall)) {split_vector2 &lt;- strsplit(DNAall[j], "")[[1]] if (all(sum(split_vector != split_vector2) &gt;=3)) **Humm_gt3[i] &lt;- DNAall[i]}}**
    • @sunta3iouxos adist 应用“广义 Levenshtein(编辑)距离”,这与“汉明距离”不同。例如,adist("GAG","AGA") 给出距离2,而汉明距离为3。这将导致完整集的大小不同。
    • @sunta3iouxos 是的,从 Hamming 和 Levenshtein 距离的定义来看,Hamming 距离依赖于每一个“位”,这是比 Levenshtein 更严格的约束,因此给予更少。
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2020-02-28
    相关资源
    最近更新 更多