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

时间:2017-12-23 13:32:46

标签: r matlab function

如果我想要一个逻辑数组和数组元素是set数组成员的位置索引,那么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

1 个答案:

答案 0 :(得分:1)

Matlab函数ismember可以转换为two ways中的R:

  • is.element
  • %in%

因此:

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

如果要包含索引,可以使用match function

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