如何从R中的另一个向量中减去具有重复字符的完整字符向量

Jie*_*Jie 4 r vector subset subtraction

我想从x中减去y,这意味着从x中删除一个“A”,三个“B”和一个“E”,所以xNew将是c("A", "C", "A","B","D")。这也意味着

length(xNew)=length(x) - length(y)
x <- c("A","A","C","A","B","B","B","B","D","E")
y <- c("A","B","B","B","E")
Run Code Online (Sandbox Code Playgroud)

setdiff 不起作用,因为

xNew <- setdiff(x,y)
xNew 
[1] "C" "D"
Run Code Online (Sandbox Code Playgroud)

匹配也不起作用

xNew <- x[-match(y,x)]
xNew
[1] "A" "C" "A" "B" "B" "B" "D"
Run Code Online (Sandbox Code Playgroud)

它删除了第五个位置上的“B”3次,所以还剩下三个“B”。

有谁知道如何做到这一点,R 中是否有可用的函数或者我们应该编写一个私有函数?预先非常感谢。

Cat*_*ath 5

您可以使用该功能pmatch

x[-pmatch(y,x)]
#[1] "A" "C" "A" "B" "D"
Run Code Online (Sandbox Code Playgroud)

编辑
如果您的数据可以是超过 1 个字符的字符串,这里有一个选项可以获取您想要的内容:

xNew <- unlist(sapply(x[!duplicated(x)], 
                      function(item, tab1, tab2) {
                          rep(item,
                              tab1[item] - ifelse(item %in% names(tab2), tab2[item], 0))
                       }, tab1=table(x), tab2=table(y)))
Run Code Online (Sandbox Code Playgroud)

例子

x <- c("AB","BA","C","CA","B","B","B","B","D","E")
y <- c("A","B","B","B","E")
xNew
#  AB   BA    C   CA    B    D 
#"AB" "BA"  "C" "CA"  "B"  "D"
Run Code Online (Sandbox Code Playgroud)