R中交叉和匹配之间的差异

时间:2016-11-24 19:55:11

标签: r set match intersection set-operations

我试图理解R中matchintersect之间的区别。两者都以不同的格式返回相同的输出。两者之间是否存在功能差异?

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"

1 个答案:

答案 0 :(得分:3)

match(a, b)返回length(a)的整数向量,第i个元素给出j位置a[i] == b[j] no_match 默认生成NA(虽然您可以对其进行自定义)。

如果您想获得与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核心比我猜的更有效率。

<强>后续

我们也可以使用

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编写的。