识别在R中的另一个可比较向量中找不到的向量的元素

x8diyxa7  于 2023-04-18  发布在  其他
关注(0)|答案(4)|浏览(88)

我想知道一个向量中没有找到的确切元素。例如,考虑以下向量:

veca <- c("ab", "cd", "ef", "gh", "ij", "kl")
vecb <- c("ab", "ef", "ij", "kl")

由此可见,cdghveca中,但不在vecb中。如何在R中识别这些元素?谢谢!

tnkciper

tnkciper1#

我们可以使用setdiff定义一个自定义函数,比如一个相反的intersect函数:
学习here

outersect <- function(x, y) {
  sort(c(setdiff(x, y),
         setdiff(y, x)))
}

outersect(veca, vecb)

输出:

[1] "cd" "gh"

另一种可能的解决方案是:

not_in_vecb <- veca[!veca %in% vecb]

[1] "cd" "gh"
czfnxgou

czfnxgou2#

您可以使用内置函数setdiff()
示例:

veca <- c("ab", "cd", "ef", "gh", "ij", "kl")
vecb <- c("ab", "ef", "ij", "kl")

print(setdiff(veca, vecb))

输出:

[1] "cd" "gh"
vnzz0bqm

vnzz0bqm3#

可以使用%in%运算符
标识veca中不存在于vecb中的元素

> veca[!(veca %in% vecb)]
[1] "cd" "gh"
sc4hvdpw

sc4hvdpw4#

这里我们考虑一个更一般的情况

veca <- c("ab", "cd", "ef", "gh", "ij", "kl") # "cd" and "gh" are not in `vecb`
vecb <- c("ab", "ef", "ij", "kl", "xy") # "xy" is not in `veca`

下面是我们可以尝试的一些选项

  1. set操作:unionsetdiffintersect
> setdiff(union(veca, vecb), intersect(veca, vecb))
[1] "cd" "gh" "xy"
  1. stack + subset,过滤出仅出现1的对象
subset(
  aggregate(
    ind ~ .,
    stack(list(a = veca, b = vecb)),
    unique
  ),
  lengths(ind) == 1,
  select = values
)

它给出了

values
2     cd
4     gh
7     xy

相关问题