我正在尝试使用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)
非常感谢您!
答案 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