我试图了解Rmatch
和intersect
R 之间的区别。两者都以不同的格式返回相同的输出。两者之间有任何功能差异吗?
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"
我试图了解Rmatch
和intersect
R 之间的区别。两者都以不同的格式返回相同的输出。两者之间有任何功能差异吗?
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)
返回 的整数向量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
.