矩阵将vector1中的每个元素与vector2

时间:2015-10-12 03:33:59

标签: r vector comparison

我想将一个矢量(D)中的每个元素与另一个矢量(E)中的每个元素进行比较,以便得到尺寸长度(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

(或1s和0s相同的效果)

我能够通过做一些笨重的事情来获得输出:

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

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

2 个答案:

答案 0 :(得分:5)

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

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的每个元素相比更快1}},然后是E[2],依此类推。

答案 1 :(得分:1)

实际上直接的做法是(感谢@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