提取两个字符串之间不同的字符

时间:2015-03-03 14:35:16

标签: r string character

我使用adist来计算两个字符串之间不同的字符数:

a <- "Happy day"
b <- "Tappy Pay"
adist(a,b) # result 2

现在我想提取那些不同的角色。在我的示例中,我想获取字符串"Hd"(或"TP",这没关系。)

我试图查看adistagrepstringi,但一无所获。

6 个答案:

答案 0 :(得分:15)

您可以使用以下操作序列:

  • 使用strsplit()分割字符串。
  • 使用setdiff()比较元素
  • 包含缩小功能

试试这个:

Reduce(setdiff, strsplit(c(a, b), split = ""))
[1] "H" "d"

答案 1 :(得分:7)

分成字母并将差异视为集合:

> setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]])
[1] "H" "d"

答案 2 :(得分:4)

并不为此感到自豪,但它似乎在做这项工作:

sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8)

结果:

[1] "H" "d"

答案 3 :(得分:3)

您可以将其中一个变量用作正则表达式字符类,并将gsub用作另一个变量:

gsub(paste0("[",a,"]"),"",b)
[1] "TP"
gsub(paste0("[",b,"]"),"",a)
[1] "Hd"

答案 4 :(得分:2)

只要ab的长度相同,我们就可以这样做:

s.a <- strsplit(a, "")[[1]]
s.b <- strsplit(b, "")[[1]]
paste(s.a[s.a != s.b], collapse = "")

,并提供:

[1] "Hd"

这在代码的清晰度方面似乎很简单,并且似乎与此处提供的最快解决方案相关,尽管我认为我更喜欢f3

f1 <- function(a, b)
  paste(setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]]), collapse = "")

f2 <- function(a, b)
  paste(sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8), collapse = "")

f3 <- function(a, b) 
  paste(Reduce(setdiff, strsplit(c(a, b), split = "")), collapse = "")

f4 <- function(a, b) {
  s.a <- strsplit(a, "")[[1]]
  s.b <- strsplit(b, "")[[1]]
  paste(s.a[s.a != s.b], collapse = "")
}

a <- "Happy day"
b <- "Tappy Pay"

library(rbenchmark)
benchmark(f1, f2, f3, f4, replications = 10000, order = "relative")[1:4]

在笔记本电脑的新会话中提供以下内容:

  test replications elapsed relative
3   f3        10000    0.07    1.000
4   f4        10000    0.07    1.000
1   f1        10000    0.09    1.286
2   f2        10000    0.10    1.429

我假设差异必须在相应的角色位置。您可能想澄清这是否意图。

答案 5 :(得分:0)

以下功能可能是解决此类问题的更好选择。

list.string.diff <- function(a, b, exclude = c("-", "?"), ignore.case = TRUE, show.excluded = FALSE)
{
if(nchar(a)!=nchar(b)) stop("Lengths of input strings differ. Please check your input.")
if(ignore.case)
{
a <- toupper(a)
b <- toupper(b)
}
split_seqs <- strsplit(c(a, b), split = "")
only.diff <- (split_seqs[[1]] != split_seqs[[2]])
only.diff[
(split_seqs[[1]] %in% exclude) |
(split_seqs[[2]] %in% exclude)
] <- NA
diff.info<-data.frame(which(is.na(only.diff)|only.diff),
split_seqs[[1]][only.diff],split_seqs[[2]][only.diff])
names(diff.info)<-c("position","poly.seq.a","poly.seq.b")
if(!show.excluded) diff.info<-na.omit(diff.info)
diff.info
  

来自https://www.r-bloggers.com/extract-different-characters-between-two-strings-of-equal-length/

然后您可以运行

list.string.diff(a, b)

获得差异。