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

时间:2017-12-14 19:53:18

标签: r string

我有两个长度相同的字符串。我想比较字符串元素并为每个索引返回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] 

3 个答案:

答案 0 :(得分: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

您还可以稍微修改Rich的已删除答案

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

请注意,第一种方法将允许比较两个以上的字符串

答案 1 :(得分: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

答案 2 :(得分:0)

我知道很久以前就已经回答了这个问题,但我想我会为所有 R 初学者提交一个方便的复制粘贴版本。所以这是@d.b 以更初学者友好的方式回答:

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

...结果如下:

 topBar: {
    width: 100,
    height: 20,
    backgroundColor: '#735dd0',
    marginTop: '5%',
    marginLeft: '5%',
    borderRadius: '5px',
    
  }, dateClass: {
    fontSize: '0.6em',
    fontWeight: 'bold', 
      
  },
    <GridList 
    <GridListTile 
    <GridListTileBar 
              className={classes.topBar} 
              title={<span className={classes.dateClass}>{picture.date}</span>}
              titlePosition="top"
            />
          </GridListTile>
     </GridList>

...现在你终于是一个快乐的露营者了。 :)