![](/img/trans.png)
[英]compare characters in two columns for each row - find things that don't match
[英]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.