我知道,如果
s1 <- "string"
s2 <- "String"
可以按如下方式进行比较:
# Case-sensitive check
s1 == s2
# Case-insensitive check
tolower(s1) == tolower(s2)
然而,我想到的是另一种比较:
s1 <- "John Smith"
s2 <- "Smith John"
如果我把前面的代码应用到这个例子中,我得到的结果是FALSE
。但是这两个字符串是由相同的单词组成的,我想比较一下,在这个例子中,TRUE
。
我们创建一个函数,通过空格(strsplit
)拆分字符串,然后unlist
,sort
,获得unique
元素,paste
它们再次在一起。
f1 <- function(x) toString(unique(sort(unlist(strsplit(tolower(x), " ")))))
f1(s1) == f1(s2)
#[1] TRUE
注:大写字母(65 ~ 90)和小写字母(97 ~ 122)的ASCII码用不同的数字表示。因此,我们需要将其设置为比较的标准用例
使用utf8ToInt
:
check_string <- function(s1, s2) {
sum(utf8ToInt(tolower(s1))) == sum(utf8ToInt(tolower(s2)))
}
check_string("string", "string")
#[1] TRUE
check_string("string", "String")
#[1] TRUE
check_string("John Smith", "Smith John")
#[1] TRUE
这些字符串基本上是相互变位的。您可以通过将两个字符串存储在map中并比较两个map来检查是否存在。
dict(collection.Counter(S1)) == dict(collection.Counter(S2))