如果我想要一个逻辑数组,而数组元素是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