我想将一个矢量(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)的循环,但是这个操作肯定有一个简单的名称和简单的代码吗?我一直在努力寻找语言来寻找这个问题的答案。
答案 0 :(得分:5)
您可以使用outer
在D
和E
中的所有元素对中以矢量化方式执行计算:
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
我认为您在问题中包含的方法有两个好处:
x
和y
值只调用一次该函数,因此它应该比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