如何查找一个向量中不在另一个向量中的元素(不使用setdiff)

时间:2019-04-15 20:06:12

标签: r set-difference

我有两个向量

x <- c(1,2,2,3,4)

y <- c(1,2,3)

我想得到x中不在y中的元素的另一个向量;所以在这种情况下(2,4)。

我已经尝试过使用setdiff()函数,但是它没有考虑重复项(它只会返回4个),所以我不确定该怎么做。

谢谢!

3 个答案:

答案 0 :(得分:5)

也许尝试一下:

x[-match(y,x,nomatch = 0)]

nomatch = 0对于避免将NA与否定下标混在一起是必需的。

要处理其他重复项,如评论中所述,另一种选择可能是使用软件包 vecsets 中的vsetdiff

library(vecsets)
x = c(1, 2, 2, 3, 3, 4)
y = c(1, 2, 2, 3)
> vsetdiff(x,y)
[1] 3 4

答案 1 :(得分:0)

它不会提供@Gregor讨论的结果,但是,应根据示例给出正确的结果:

x[duplicated(x) | !x %in% y]

[1] 2 4

个别步骤:

duplicated(x)

[1] FALSE FALSE  TRUE FALSE FALSE

!x %in% y

[1] FALSE FALSE FALSE FALSE  TRUE

duplicated(x) | !x %in% y

[1] FALSE FALSE  TRUE FALSE  TRUE

答案 2 :(得分:0)

考虑到OP的原始示例并阅读@Gregor的注释,我编写了以下函数,该函数可以执行OP所需的功能,并考虑到@Gregor指出的内容

## function to find values in x that are absent in y
x.not.in.y <- function(x, y) {
  # get freq tables for x and y
  x.tab <- table(x)
  y.tab <- table(y)
  # if a value is missing in y then set its freq to zero
  y.tab[setdiff(names(x.tab), names(y.tab))] = 0
  y.tab <- y.tab[names(y.tab) %in% names(x.tab)]
  # get the difference of x and y freq and keep if > 0
  diff.tab <- x.tab[order(names(x.tab))] - y.tab[order(names(y.tab))]
  diff.tab <- diff.tab[diff.tab > 0]
  # output vector of x values missing in y
  unlist(
    lapply(names(diff.tab), function(val) {
      rep(as.numeric(val), diff.tab[val])
    }), 
    use.names = F)
}

# OP's original data
x.not.in.y(x = c(1,2,2,3,4), y = c(1,2,3))
#> [1] 2 4

# @Gregor's data
x.not.in.y(x = c(1,2,2,3,3,4), y = c(1,2,2,3))
#> [1] 3 4

# some other data with extra value in y but absent in y
x.not.in.y(x = c(1,2,2,2,2,3,3,3,4,5), y = c(1,2,3,6))
#> [1] 2 2 2 3 3 4 5

reprex package(v0.2.1)于2019-04-15创建