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

时间:2016-03-23 06:52:57

标签: r string

我有两个字符串,a <- "AERRRTX"; b <- "TRRA"

我想提取a中未使用的b中的字符,即&#34; ERX&#34;

我在Extract characters that differ between two strings中尝试了使用setdiff的答案。它返回&#34; EX&#34;,因为b确实有&#34; R&#34;并且setdiff将消除a中的所有三个&#34; R&#34;我的目标是将每个角色视为不同的角色,因此a中的三个R中只有两个被淘汰。

有关我可以使用的内容而不是setdiff或其他方法来实现我的输出的任何建议吗?

4 个答案:

答案 0 :(得分:10)

使用pmatch

的不同方法
a1 <- unlist(strsplit(a, ""))
b1 <- unlist(strsplit(b, "")) 

a1[!1:length(a1) %in% pmatch(b1, a1)]

 #[1] "E" "R" "X"

另一个例子,

a <- "Ronak";b<-"Shah"

a1 <- unlist(strsplit(a, ""))
b1 <- unlist(strsplit(b, ""))
a1[!1:length(a1) %in% pmatch(b1, a1)]

# [1] "R" "o" "n" "k"

答案 1 :(得分:4)

我们可以使用Reduce()连续消除a中找到的b个字符:

a <- 'AERRRTX'; b <- 'TRRA';
paste(collapse='',Reduce(function(as,bc) as[-match(bc,as,nomatch=length(as)+1L)],strsplit(b,'')[[1L]],strsplit(a,'')[[1L]]));
## [1] "ERX"

这将保留a中幸存字符的顺序。

另一种方法是在a中为每个字符标记其出现索引,对b标记相同,然后我们可以使用setdiff()

a <- 'AERRRTX'; b <- 'TRRA';
pasteOccurrence <- function(x) ave(x,x,FUN=function(x) paste0(x,seq_along(x)));
paste(collapse='',substr(setdiff(pasteOccurrence(strsplit(a,'')[[1L]]),pasteOccurrence(strsplit(b,'')[[1L]])),1L,1L));
## [1] "ERX"

答案 2 :(得分:4)

您可以使用 vecsets 包中的 vsetdiff 功能

install.packages("vecsets")
library(vecsets)
a <- "AERRRTX"
b <- "TRRA"  
Reduce(vsetdiff, strsplit(c(a, b), split = ""))
## [1] "E" "R" "X"

答案 3 :(得分:3)

使用class DashboardNavViewController: UINavigationController { package`的替代方案:

data.table