在R中是否有类似于MATLAB的ismember的函数?



如果我想要一个逻辑数组,而数组元素是SET数组成员的位置索引,则R中有一个函数,它在R中提供了与Matlab的ismember()相似的输出。

MATLAB代码:

A = [5 3 4 2]; 
B = [2 4 4 4 6 8]; 
[la loc] = ismember(A,B) 

输出:

la = 1x4 logical array
   0   0   1   1
loc = 
     0     0     2     1

要在R中获得类似的输出,我使用此信息:

ismember <- function(A,B){
        out <- match(A,B)
        out <- cbind(out,(A %in% B)*1)
        out[is.na(out)] <- 0
}
ismember(A,B)

输出:

     out  
[1,]   0 0
[2,]   0 0
[3,]   2 1
[4,]   1 1

MATLAB函数ismember可以通过两种方式转换为R:

  • is.element
  • %in%

因此:

ismember(A,B) ---> is.element(A, B)
ismember(A,B) ---> A %in% B

如果要包括索引,则可以使用匹配功能:

loc <- match(A, B)
print(loc)
   [1] NA NA 2 1

默认情况下,使用match时,无匹配返回NA的值,但是您可以通过nomatch参数更改此行为:

loc <- match(A, B, nomatch = 0)
print(loc)
   [1] 0 0 2 1

总而言之,您的MATLAB代码:

A = [5 3 4 2]; 
B = [2 4 4 4 6 8];
[la,loc] = ismember(A,B);

基本上可以翻译成:

A <- c(5,3,4,2)
B <- c(2,4,4,4,6,8)
la <- is.element(A, B)
loc <- match(A, B, nomatch = 0)

如果要获取两个值合并到一个单个变量中,则可以使用:

res <- cbind.data.frame(la = is.element(A, B), loc = match(A, B, nomatch = 0))
print(res$la)
   [1] FALSE FALSE  TRUE  TRUE
print(res$loc)
   [1] 0 0 2 1

最新更新