R在一个矢量与另一个矢量的个别元素上的sapply

时间:2015-12-17 20:36:37

标签: r sapply euclidean-distance

我有两个向量xcen。假设x的长度为10cen的长度为3。我想找到xcen各个点之间的欧几里德距离。

欧几里德距离函数定义为:euc.dist <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))

我看到sapply与否定"-"运算符一样:

> x 
 [1] 23  4 65  8  9 23 90 76 55  7
> cen
 [1] 23  4 65
> sapply(x,"-",cen)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0  -19   42  -15  -14    0   67   53   32   -16
[2,]   19    0   61    4    5   19   86   72   51     3
[3,]  -42  -61    0  -57  -56  -42   25   11  -10   -58

此处cen向量中的每个值都在整个x向量上运行。

但是当我尝试使用euc.dist函数而不是"-"时,我只得到一个向量作为输出而不是3x10矩阵。

> sapply(x,"euc.dist",cen)
 [1]  46.09772  63.89053  74.06079  59.07622  57.93962  46.09772 111.84811  90.07774  61.03278  60.24118

为什么会发生这种情况的原因?我是否需要以不同的方式定义euc.dist函数?任何帮助,将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的euc.dist函数没有矢量化,可以通过以下方式轻松测试:

euc.dist(x[1],cen)
[1] 46.09772

而你可能想要的是:

> Vectorize(euc.dist)(x[1],cen)
[1]  0 19 42

(使用?Vectorize了解详情。)

因此,在您的情况下,一个简单的解决方案是:

> sapply(x,Vectorize(euc.dist),cen)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0   19   42   15   14    0   67   53   32    16
[2,]   19    0   61    4    5   19   86   72   51     3
[3,]   42   61    0   57   56   42   25   11   10    58

答案 1 :(得分:1)

这是怎么回事? 因为你想要所有因子组合

datas <- expand.grid(x = x,cen = cen)
datas$euclid = apply(datas,1,function(rowval) euc.dist(rowval[1], rowval[2]))