我有两个字符串,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
或其他方法来实现我的输出的任何建议吗?
答案 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