R中相交和匹配的区别

Difference between intersect and match in R

我试图了解 R 中 matchintersect 之间的区别。两者 return 以不同的格式输出相同的内容。两者在功能上有什么区别吗?

match(names(set1), names(set2))
#  [1] NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 11

intersect(names(set1), names(set2))
# [1] "Year"     "ID"

match(a, b) returns length(a) 的整数向量,第 i 个元素给出位置 j 使得 a[i] == b[j] . NA 默认为 no_match 生成(尽管您可以自定义它)。

如果您想获得与 intersect(a, b) 相同的结果,请使用以下任一方法:

b[na.omit(match(a, b))]
a[na.omit(match(b, a))]

例子

a <- 1:5
b <- 2:6

b[na.omit(match(a, b))]
# [1] 2 3 4 5

a[na.omit(match(b, a))]
# [1] 2 3 4 5

I just wanted to know if there any other differences between the both. I was able to understand the results myself.

然后我们阅读源码

intersect
#function (x, y) 
#{
#    y <- as.vector(y)
#    unique(y[match(as.vector(x), y, 0L)])
#}

原来intersect是用match写的!

哈哈,好像忘了外面的unique了。 Em,通过设置nomatch = 0L我们也可以去掉na.omit。嗯,R core 比我猜的更有效率。


跟进

我们也可以使用

a[a %in% b]  ## need a `unique`, too
b[b %in% a]  ## need a `unique`, too

但是,请阅读 ?match。在 "Details" 中我们可以看到 "%in%" 是如何定义的:

"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0

所以,是的,所有内容都是使用 match 编写的。