2016-11-24 70 views
1

我想了解R中的matchintersect之間的區別。兩者都以不同的格式返回相同的輸出。兩者之間是否有功能差異?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" 
+0

http://www.rexamples.com/12/Match()比賽ID中的更多變化說。考慮使用不匹配和不可兼容性。 http://www.endmemo.com/program/R/match.php –

回答

2

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核心比我的猜測更有效率。


後續

我們也可以使用

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寫的。

+0

我只是想知道兩者之間是否存在其他差異。我自己能夠理解結果。謝謝! – goutam