2017-12-14 1 views
2

Ich habe zwei Saiten, die die gleiche Länge haben. Ich möchte die Strings elementweise vergleichen und für jeden Index ein TRUE oder FALSE zurückgeben. Zum Beispiel:Wie vergleicht man Zeichen aus zwei Strings an jedem Index?

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

Bisher habe ich die Saiten, und ich habe Charakter Vektoren erstellt von ihnen Entadressierung aber ich habe nicht in der Lage gewesen, eine der String-Funktionen in R zu erhalten, so weit zu arbeiten. Ich weiß, ich könnte eine for-Schleife verwenden und eine einfache tun ==, aber ich fragte mich, ob es eine Art vektorisierten Weg, dies zu tun.

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

Es gibt auch Fälle, in denen eine der Saiten _ anzeigt wird, dass dieser Charakter ist im Wesentlichen eine Wildcard und es funktioniert nicht auf Gleichheit geprüft werden müssen. Deshalb habe ich versucht, eines der Regex-Dinge in R zu bekommen, damit ich das _ durch einen Platzhalter ersetzen konnte.

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

Versuchen Sie dies: 'str1 == str2'. == überprüft alle Elemente entlang jedes Vektors nchars (string1) == nchars (string2) – Dave2e

+0

Wow, ich fühle mich dumm. Das funktioniert. Ich habe meine Frage mit einem kleinen Eckfall bearbeitet. – mikew

Antwort

2
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 

Sie auch Richs gelöscht Antwort

Reduce(f = function(s1, s2){ 
    s1 == s2 | s1 == "_" | s2 == "_" 
}, 
x = strsplit(c(string1, string2), "")) 
#[1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE 

Beachten Sie, dass der erste Ansatz Vergleich ermöglicht von mehr als zwei Strings

+0

Danke! Das funktioniert, würde es Ihnen etwas ausmachen, die Antwort zu teilen, die Sie gepostet haben, bevor Sie sie auch auf diese geändert haben? – mikew

2

Hier ist etwas könnte Methode Brute-Force ändern. Ich bin der str_locate_all, um alle "_" in beiden Strings zu finden und diese Werte auf True zu setzen, um die Wildcard-Natur des Problems zu berücksichtigen.

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 
Verwandte Themen