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