在 R 中将一个向量与另一个向量的各个元素一起应用
sapply in R over a vector with individual elements of another vector
我有两个向量 x
和 cen
。假设 x
的长度是 10
而 cen
的长度是 3
。我想找到 x
和 cen
的各个点之间的欧氏距离。
欧氏距离函数定义为: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
我有两个向量 x
和 cen
。假设 x
的长度是 10
而 cen
的长度是 3
。我想找到 x
和 cen
的各个点之间的欧氏距离。
欧氏距离函数定义为: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