Используя R, чтобы найти начальную разницу двух строк - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь использовать 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 голосов
/ 17 сентября 2018

Базовая функция abbreviate может дать решение, так как с ее значениями по умолчанию она пытается найти первый символ, определяющий разницу между строками, чтобы создать уникальные сокращения:

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

nchar(abbreviate(c("ABCDE","DEFGH"),minlength=1)[1])
#ABCDE 
#    1
0 голосов
/ 17 сентября 2018

Мы можем разбить строку и сравнить символ за символом и получить первое несоответствие, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...