簡體   English   中英

如何比較每個索引處兩個字符串的字符?

[英]How to compare characters of two string at each index?

我有兩個長度相同的字符串。 我想按元素比較字符串並為每個索引返回 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] 
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

請注意,第一種方法將允許比較兩個以上的字符串

這里是蠻力方法。 我是 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

我知道很久以前就已經回答了這個問題,但我想我會為所有 R 初學者提交一個方便的復制粘貼版本。 所以這是@db 以更初學者友好的方式回答:

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

......現在你終於是一個快樂的露營者了。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM