R:非贪婪的setdiff版本?

Fr.*_*Fr. 6 r

这是setdiff正常的行为:

x <- rep(letters[1:4], 2)
x
# [1] "a" "b" "c" "d" "a" "b" "c" "d"

y <- letters[1:2]
y
# [1] "a" "b"

setdiff(x, y)
# [1] "c" "d"
Run Code Online (Sandbox Code Playgroud)

...但是如果我只想y取出一次,那么得到以下结果呢?

# "c" "d" "a" "b" "c" "d"

我猜,有使用任何一种简单的解决方案setdiff还是%in%,但我就是不能看到它.

42-*_*42- 6

match返回第二个参数的第一个参数(第一个)匹配位置的向量.它用作索引构造函数:

x[ -match(y,x) ]
 #[1] "c" "d" "a" "b" "c" "d"
Run Code Online (Sandbox Code Playgroud)

如果'y'中有重复项并且你想要与其中的数字成比例地删除,那么我想到的第一件事就是for循环:

y <- c("a","b","a")
x2 <- x
for( i in seq_along(y) ){ x2 <- x2[-match(y[i],x2)] }

> x2
[1] "c" "d" "b" "c" "d"
Run Code Online (Sandbox Code Playgroud)

这将是使用下面建议的制表方法的一种可能结果.使用一些"set"函数,但这不是一个确定的问题.似乎有点"矢量化":

c( table(x [x %in% intersect(x,y)]) - table(y[y %in% intersect(x,y)]) , 
   table( x[!x %in% intersect(x,y)]) )
a b c d 
0 1 2 2 
Run Code Online (Sandbox Code Playgroud)