R:非贪婪的setdiff版本?

时间:2017-01-08 10:02:27

标签: 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"

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

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

我猜测使用setdiff%in%有一个简单的解决方案,但我看不到它。

2 个答案:

答案 0 :(得分:5)

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

x[ -match(y,x) ]
 #[1] "c" "d" "a" "b" "c" "d"

如果&#39; y&#39;中有重复项并且你希望删除与其中的数字成比例,那么我想到的第一件事就是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"

这是使用下面建议的制表方法的一种可能结果。使用一些&#34; set&#34;功能,但这不是一个确定的问题。似乎更多&#34; vectorised&#34;:

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 

答案 1 :(得分:0)

这是另一种循环方法。我认为42的方法更清晰,但它提供了另一种选择。

# construct a table containing counts for all possible values in x and y in y
myCounts <- table(factor(y, levels=sort(union(x, y))))

# extract these elements from x
x[-unlist(lapply(names(myCounts),
                 function(i) which(i == x)[seq_len(myCounts[i])]))]

“非贪婪”方面来自[seq_len(myCounts[i])],它只占用y中存在的相同元素的数量