我试图理解R中match
和intersect
之间的区别。两者都以不同的格式返回相同的输出。两者之间是否存在功能差异?
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"
答案 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
编写的。