将 vector1 中的每个元素与 vector2 中的每个元素进行比较的矩阵

Matrix comparing each element in vector1 to each element in vector2

我想将一个向量 (D) 中的每个元素与另一个向量 (E) 中的每个元素进行比较,以便我得到一个维度为 length(D)xlength(E) 的矩阵。

相关比较的形式为:

abs(D[i]-E[j])<0.1

因此

D <- c(1:5)
E <- c(2:6)

我想得到

       [,1]  [,2]  [,3]  [,4]  [,5]
[1,] FALSE  TRUE FALSE FALSE FALSE
[2,] FALSE FALSE  TRUE FALSE FALSE
[3,] FALSE FALSE FALSE  TRUE FALSE
[4,] FALSE FALSE FALSE FALSE  TRUE
[5,] FALSE FALSE FALSE FALSE FALSE

(或 1 和 0 效果相同)

我已经能够通过做一些笨拙的事情来获得该输出:

rbind(D%in%E[1],D%in%E[2],D%in%E[3],D%in%E[4],D%in%E[5])

我可以为1:length(E)写一个循环,但是这个操作肯定有一个简单的名称和简单的代码吗?我一直在努力寻找语言来寻找这个问题的答案。

您可以使用 outer 以矢量化方式对 DE 中的所有元素对执行计算:

outer(E, D, function(x, y) abs(x-y) <= 0.1)
#       [,1]  [,2]  [,3]  [,4]  [,5]
# [1,] FALSE  TRUE FALSE FALSE FALSE
# [2,] FALSE FALSE  TRUE FALSE FALSE
# [3,] FALSE FALSE FALSE  TRUE FALSE
# [4,] FALSE FALSE FALSE FALSE  TRUE
# [5,] FALSE FALSE FALSE FALSE FALSE

与您在问题中包含的那种方法相比,我看到了两个好处:

  • 打字少
  • 效率更高:每对 xy 值只调用一次该函数,因此它应该比将 E[1] 与每个元素进行比较更快D,然后是 E[2],依此类推。

实际上一个直接的方法是(感谢@alexis_laz):

n = length(E)
abs(E - matrix(D, ncol=n, nrow=n, byrow=T))<0.1

#      [,1]  [,2]  [,3]  [,4]  [,5]
#[1,] FALSE  TRUE FALSE FALSE FALSE
#[2,] FALSE FALSE  TRUE FALSE FALSE
#[3,] FALSE FALSE FALSE  TRUE FALSE
#[4,] FALSE FALSE FALSE FALSE  TRUE
#[5,] FALSE FALSE FALSE FALSE FALSE