在 R 中将一个向量与另一个向量的各个元素一起应用

sapply in R over a vector with individual elements of another vector

我有两个向量 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 函数?任何帮助,将不胜感激。提前致谢。

这个怎么样? 因为你想要所有因素组合

datas <- expand.grid(x = x,cen = cen)
datas$euclid = apply(datas,1,function(rowval) euc.dist(rowval[1], rowval[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