此处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%
有一个简单的解决方案,但我看不到它。
答案 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中存在的相同元素的数量