【问题标题】:Using R to find the start difference of two strings使用 R 查找两个字符串的起始差异
【发布时间】:2018-09-17 02:42:27
【问题描述】:

我正在尝试使用R来查找两个字符串的起始差异,即这两个字符串从哪个字母开始不同,并希望该函数可以给我位置编号。该函数总是给出值 2,并且似乎循环只运行一次。

这是我的代码:

string1 = "CGCGGTGCATCCTGGGAGTTGTAGTTTTTTCTACTCAGAGGGAGAATAGCTCCAGACGGGAGCAGGATGA"
string2 = "CGCGGTGCATCCTGGGATGTAGTTTTTTCTACTCAGAGGGAGAATAGCTCCAGACGGGAGCAGGATGA"

location <- function(string1, string2){
  len1 = nchar(string1)
  len2 = nchar(string2)
  len = max(len1, len2)
  score = 1
  i = 1
  if (i <= len){
     if (substring(string1, i, i) == substring(string2, i, i)){
     score = score + 1
     i = i + 1
   }
  else if (substring(string1, i, i) != substring(string2, i, i)){
  break
   }
 }
  return(score)
}

location(string1, string2)

非常感谢!

【问题讨论】:

    标签: r string compare


    【解决方案1】:

    我们可以分割字符串并逐个字符比较,并使用which.min得到第一个不匹配

    which.min(strsplit(string1, "")[[1]] == strsplit(string2, "")[[1]])
    #[1] 18
    

    上述方法在nchar(string1)不等于nchar(string2)时返回警告信息

    警告信息: 在 strsplit(string1, "")[[1]] == strsplit(string2, "")[[1]] : 较长的对象长度不是较短对象长度的倍数

    大多数情况下可以忽略此消息,它仍然会给您正确的答案。

    但是,为了使其完整和可靠,我们可以编写一个函数

    location <- function(string1, string2) {
      n = pmin(nchar(string1), nchar(string2))
      i = 1
      while (i <= n) {
        if (substr(string1, i, i) != substr(string2, i, i)) 
           return(i)
        i = i + 1
      }
     cat("There is no difference between two strings")
    }
    
    location(string1, string2)
    #[1] 18
    
    location("Ronak", "Shah")
    #[1] 1
    
    location("Ronak", "Ronak")
    #There is no difference between two strings
    

    【讨论】:

    • 嗨,Ronak 我看起来就像这样来比较核苷酸延伸,所以可以说我得到了 20 个在两次比较中不同的位置或字符串,有什么方法可以打印这些?
    • 您可以存储我们遇到差异的位置,而不是return(i)。如果您在实施解决方案时遇到困难,可以将其作为一个新问题提出。
    • 让我先试试,让你知道
    • 我想几天前我确实在 R 论坛的这个部分提出了问题,但现在我看到此消息不允许从该帐户提出更多问题...我不确定如何创建新问题。 ..
    【解决方案2】:

    基本函数abbreviate可以给出解决方案,因为它的默认值会尝试找到第一个字符来区分字符串,以便生成唯一的缩写:

    nchar(abbreviate(c(string1,string2),minlength=1)[1])
    #CGCGGTGCATCCTGGGAGTTGTAGTTTTTTCTACTCAGAGGGAGAATAGCTCCAGACGGGAGCAGGATGA 
    #                                                                    18
    
    nchar(abbreviate(c("ABCDE","DEFGH"),minlength=1)[1])
    #ABCDE 
    #    1
    

    【讨论】:

    • 这是重新思考这个问题背后的算法的另一个好方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多