提取两个字符串之间不同的字符
Extract characters that differ between two strings
我已经使用 adist
计算了两个字符串之间不同的字符数:
a <- "Happy day"
b <- "Tappy Pay"
adist(a,b) # result 2
现在我想提取那些不同的字符。在我的示例中,我想获取字符串 "Hd"
(或 "TP"
,这无关紧要)。
我试图查看 adist
、agrep
和 stringi
,但一无所获。
只要a
和b
的长度相同我们就可以这样做:
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
我假设不同之处一定在相应的字符位置。您可能想澄清这是否是故意的。
对此并不感到自豪,但它似乎可以胜任:
sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8)
结果:
[1] "H" "d"
拆分成字母,取差为集合:
> setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]])
[1] "H" "d"
您可以使用以下操作顺序:
- 使用
strsplit()
. 拆分字符串
- 使用
setdiff()
比较元素
- 包装在一个缩减函数中
试试这个:
Reduce(setdiff, strsplit(c(a, b), split = ""))
[1] "H" "d"
您可以使用其中一个变量作为正则表达式字符 class 和 gsub
从另一个变量中取出:
gsub(paste0("[",a,"]"),"",b)
[1] "TP"
gsub(paste0("[",b,"]"),"",a)
[1] "Hd"
以下函数可能是解决此类问题的更好选择。
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
from https://www.r-bloggers.com/extract-different-characters-between-two-strings-of-equal-length/
那你可以运行
list.string.diff(a, b)
求差。
我已经使用 adist
计算了两个字符串之间不同的字符数:
a <- "Happy day"
b <- "Tappy Pay"
adist(a,b) # result 2
现在我想提取那些不同的字符。在我的示例中,我想获取字符串 "Hd"
(或 "TP"
,这无关紧要)。
我试图查看 adist
、agrep
和 stringi
,但一无所获。
只要a
和b
的长度相同我们就可以这样做:
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
我假设不同之处一定在相应的字符位置。您可能想澄清这是否是故意的。
对此并不感到自豪,但它似乎可以胜任:
sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8)
结果:
[1] "H" "d"
拆分成字母,取差为集合:
> setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]])
[1] "H" "d"
您可以使用以下操作顺序:
- 使用
strsplit()
. 拆分字符串
- 使用
setdiff()
比较元素 - 包装在一个缩减函数中
试试这个:
Reduce(setdiff, strsplit(c(a, b), split = ""))
[1] "H" "d"
您可以使用其中一个变量作为正则表达式字符 class 和 gsub
从另一个变量中取出:
gsub(paste0("[",a,"]"),"",b)
[1] "TP"
gsub(paste0("[",b,"]"),"",a)
[1] "Hd"
以下函数可能是解决此类问题的更好选择。
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
from https://www.r-bloggers.com/extract-different-characters-between-two-strings-of-equal-length/
那你可以运行
list.string.diff(a, b)
求差。