1

我试图了解RmatchintersectR 之间的区别。两者都以不同的格式返回相同的输出。两者之间有任何功能差异吗?

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"
4

1 回答 1

3

match(a, b)返回 的整数向量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

我只是想知道两者之间是否还有其他区别。我自己能够理解结果。

然后我们阅读源码

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。在“详细信息”中,我们可以看到如何"%in%"定义:

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

所以,是的,一切都是用match.

于 2016-11-24T19:59:48.313 回答