差集合的なにか

集合は定義から、同じ要素は含まないわけですが、そうゆうのも許して欲しいときがある。こういう2つのベクトルがあったとき

x <- c("a", "b", "c", "a", "a", "b")
y <- c("c", "d", "c")

Rでの差集合演算を使うともちろんこうなる。

> setdiff(x, y)
[1] "a" "b"

定義からいくともちろん正しいのだが

c("a", "b", "a", "a", "b")

で返ってきて欲しい場合もある。というわけで、ごねくりまわしてなんとかしてみた。頭が悪いので、きっともっとよい方法があるに違いない。まる。

x <- c("a", "b", "c", "a", "a", "b")
y <- c("c", "d", "c")

tmp <- table(x)[setdiff(names(table(x)), names(table(y)))]
result <- unlist(apply(data.frame(names(tmp), as.vector(tmp)), 1,
             function(x) {
               x1 <- x[1];x2 <- x[2]
               rep.int(x1, x2)
             }))

結果。

> result
[1] "a" "a" "a" "b" "b"

順序は保存されないが、回数は保存されるのでまあいいか。