使用R查找两个字符串的起始差异

时间:2018-09-17 02:42:27

标签: r string compare

我正在尝试使用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)

非常感谢您!

2 个答案:

答案 0 :(得分:3)

我们可以分割字符串并逐个字符地进行比较,并使用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

答案 1 :(得分:1)

基本函数abbreviate可以提供解决方案,因为默认情况下,它会尝试查找使字符串之间有所不同的第一个字符,以使其具有唯一的缩写:

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

nchar(abbreviate(c("ABCDE","DEFGH"),minlength=1)[1])
#ABCDE 
#    1