如何比较两个字符串在每个索引处的字符?

3

我有两个长度相同的字符串。我想逐个比较这些字符串并返回每个索引的TRUE或FALSE。例如:

string1 <- "abcd1234"
string2 <- "abcd1434"
result <- [T,T,T,T,T,F,T,T]

到目前为止,我已经有了字符串,并通过将它们解除列表化创建了字符向量,但是我迄今为止还没有能够让R中的任何字符串函数起作用。我知道我可以使用for循环并执行简单的==,但我想知道是否有某种矢量化的方法来做到这一点。

str1 <- unlist(str_split(string1, "")) 
str2 <- unlist(str_split(string2, "")) 

有些情况下,两个字符串中的一个会包含 _ 符号,表示该字符是通配符,无需检查是否相等。因此我尝试使用 R 中的正则表达式之一,将 _ 替换为通配符。

string1 <- "abcd_234"
string2 <- "abcd1224"
result <- [T,T,T,T,T,T,F,T] 

1
尝试这个:str1==str2。双等号将检查每个向量上的所有元素,假如string1的字符数等于string2的字符数。 - Dave2e
哇,我感觉很蠢。那确实有效,我已经在我的问题中编辑了一个小的边角情况。 - mikew
3个回答

4
apply(do.call(rbind, strsplit(c(string1, string2), "")), 2, function(x){
    length(unique(x[!x %in% "_"])) == 1
})
#[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

您可以稍微修改Rich删除的答案。
Reduce(f = function(s1, s2){
    s1 == s2 | s1 == "_" | s2 == "_"
},
x = strsplit(c(string1, string2), ""))
#[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

请注意,第一种方法允许比较超过两个字符串。

谢谢!这个可行,您介意分享一下您之前发布的答案吗? - mikew

2

这里是一种暴力方法。我使用str_locate_all来查找两个字符串中所有的“_”并将这些值设置为True,以考虑问题的通配符特性。

library(stringr)
string1 <- "abcd_234"
string2 <- "abcd1224"

str1 <- str_split(string1, "")[[1]]
str2 <- str_split(string2, "")[[1]]

#compare characters one by one
result<- str1==str2

#Correct for wildcards in both strings
result[str_locate_all(string1, "_")[[1]][,1]]<-TRUE
result[str_locate_all(string2, "_")[[1]][,1]]<-TRUE

result
#[1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

0

我知道这个问题早就有答案了,但我想为所有R语言初学者提交一个方便的复制粘贴版本。所以这里是@d.b的答案,以一种更适合初学者的方式:

f.check.string.equality <- function(s1, s2) {
  isEqual = TRUE;
  resEqualCheck = apply(do.call(rbind, strsplit(c(s1, s2), "")), 2, function(x) {
    length(unique(x[!x %in% "_"])) == 1 }
  )
  for (val in resEqualCheck) {
    if (val == FALSE) {
      isEqual = val
    }
  }
  return(list(isEqual=isEqual, charsResult=resEqualCheck))
}

然后,您只需按以下方式使用输入字符串调用函数进行比较:
strComp1 = f.check.string.equality("TestStr", "teststr")
strComp2 = f.check.string.equality(tolower("TestStr"), "teststr")

... 结果如下:

strComp1$isEqual   
> strComp1$isEqual
[1] FALSE 


strComp1$charsResult
> strComp1$charsResult
[1] FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

strComp2$isEqual   
> strComp2$isEqual
[1] TRUE 


strComp2$charsResult
> strComp2$charsResult
[1] TRUE  TRUE  TRUE  TRUE TRUE  TRUE  TRUE

......而现在你终于成为了一个快乐的编程人员。 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接