成对距离二矩阵R
Pairwise distance two matrix R
我想 运行 R 中矩阵之间的距离。在这个例子中,我使用曼哈顿距离,但我想应用其他公式。我的问题是,有没有一种方法可以通过 R 中其他矩阵的行将函数应用于矩阵的行?
在这个例子中,我只有两个变量,但我想应用超过 10 个变量。
谢谢。
set.seed(123)
mat1 <- data.frame(x=sample(1:10000,3),
z=sample(1:10000,3))
mat2 <- data.frame(x=sample(1:100,3),
z=sample(1:1000,3))
dista<-matrix(0,ncol=2,nrow=2)
for (j in 1:nrow(mat1)){
for(i in 1:nrow(mat2)){
dista[i,j]<-sqrt((mat1[i,1]-mat2[j,1]) + (mat1[i,2]-mat2[j,2]))
}
}
dista
您的代码仍然是错误的,因为输出的长度应该是 nrow(mat1) * nrow(mat2)
,即 9
,并且不能放入 2x2 矩阵(您之前定义的矩阵)中。此外,i
应该 运行 到 mat1
和 j
到 mat2
;你有相反的方式。将 dista[i,j] <-
更改为 print()
,您将获得:
dista<-matrix(0,ncol=2,nrow=2)
for (i in 1:nrow(mat1)){
for(j in 1:nrow(mat2)){
print(sqrt((mat1[i,1]-mat2[j,1]) + (mat1[i,2]-mat2[j,2])))
}
}
[1] 105.8159
[1] 129.5261
[1] 63.52165
[1] 103.257
[1] 127.4441
[1] 59.1608
[1] 105.8253
[1] 129.5338
[1] 63.53739
您可以使用 outer
将计算限制为仅一个向量化函数
y = outer(1:nrow(mat1),1:nrow(mat2),paste)
y
[,1] [,2] [,3]
[1,] "1 1" "1 2" "1 3"
[2,] "2 1" "2 2" "2 3"
[3,] "3 1" "3 2" "3 3"
sapply(as.vector(y), function(x){
aux = as.numeric(strsplit(x," ")[[1]])
sqrt((mat1[aux[1],1]-mat2[aux[2],1]) + (mat1[aux[1],2]-mat2[aux[2],2]))})
1 1 2 1 3 1 1 2 2 2 3 2 1 3 2 3 3 3
105.81588 129.52606 63.52165 103.25696 127.44411 59.16080 105.82533 129.53378 63.53739
这里,我们首先创建一个包含所有i
和j
组合的y
矩阵,将其馈送到sapply
,然后拆分得到i
和 j
分别。
您可以使用 proxy
包来解决这些问题。
默认情况下,proxy::dist
将矩阵或数据框的每一行视为单个 "object"。
library(proxy)
proxy::dist(mat1, mat2, method="Manhattan")
[,1] [,2] [,3]
[1,] 4804 4832 4656
[2,] 3708 3736 3560
[3,] 17407 17435 17259
proxy::dist(mat1, mat2, method="Euclidean")
[,1] [,2] [,3]
[1,] 3397.036 3417.059 3295.962
[2,] 2761.996 2787.495 2708.075
[3,] 12308.674 12328.422 12204.286
在 R 控制台中键入 vignette("overview", "proxy")
以查看它包含哪些相似点和不同点,
如果您想添加自己的可与 proxy::dist
.
一起使用的函数,请查看 proxy::pr_DB
的文档
我想 运行 R 中矩阵之间的距离。在这个例子中,我使用曼哈顿距离,但我想应用其他公式。我的问题是,有没有一种方法可以通过 R 中其他矩阵的行将函数应用于矩阵的行?
在这个例子中,我只有两个变量,但我想应用超过 10 个变量。
谢谢。
set.seed(123)
mat1 <- data.frame(x=sample(1:10000,3),
z=sample(1:10000,3))
mat2 <- data.frame(x=sample(1:100,3),
z=sample(1:1000,3))
dista<-matrix(0,ncol=2,nrow=2)
for (j in 1:nrow(mat1)){
for(i in 1:nrow(mat2)){
dista[i,j]<-sqrt((mat1[i,1]-mat2[j,1]) + (mat1[i,2]-mat2[j,2]))
}
}
dista
您的代码仍然是错误的,因为输出的长度应该是 nrow(mat1) * nrow(mat2)
,即 9
,并且不能放入 2x2 矩阵(您之前定义的矩阵)中。此外,i
应该 运行 到 mat1
和 j
到 mat2
;你有相反的方式。将 dista[i,j] <-
更改为 print()
,您将获得:
dista<-matrix(0,ncol=2,nrow=2)
for (i in 1:nrow(mat1)){
for(j in 1:nrow(mat2)){
print(sqrt((mat1[i,1]-mat2[j,1]) + (mat1[i,2]-mat2[j,2])))
}
}
[1] 105.8159
[1] 129.5261
[1] 63.52165
[1] 103.257
[1] 127.4441
[1] 59.1608
[1] 105.8253
[1] 129.5338
[1] 63.53739
您可以使用 outer
将计算限制为仅一个向量化函数
y = outer(1:nrow(mat1),1:nrow(mat2),paste)
y
[,1] [,2] [,3]
[1,] "1 1" "1 2" "1 3"
[2,] "2 1" "2 2" "2 3"
[3,] "3 1" "3 2" "3 3"
sapply(as.vector(y), function(x){
aux = as.numeric(strsplit(x," ")[[1]])
sqrt((mat1[aux[1],1]-mat2[aux[2],1]) + (mat1[aux[1],2]-mat2[aux[2],2]))})
1 1 2 1 3 1 1 2 2 2 3 2 1 3 2 3 3 3
105.81588 129.52606 63.52165 103.25696 127.44411 59.16080 105.82533 129.53378 63.53739
这里,我们首先创建一个包含所有i
和j
组合的y
矩阵,将其馈送到sapply
,然后拆分得到i
和 j
分别。
您可以使用 proxy
包来解决这些问题。
默认情况下,proxy::dist
将矩阵或数据框的每一行视为单个 "object"。
library(proxy)
proxy::dist(mat1, mat2, method="Manhattan")
[,1] [,2] [,3]
[1,] 4804 4832 4656
[2,] 3708 3736 3560
[3,] 17407 17435 17259
proxy::dist(mat1, mat2, method="Euclidean")
[,1] [,2] [,3]
[1,] 3397.036 3417.059 3295.962
[2,] 2761.996 2787.495 2708.075
[3,] 12308.674 12328.422 12204.286
在 R 控制台中键入 vignette("overview", "proxy")
以查看它包含哪些相似点和不同点,
如果您想添加自己的可与 proxy::dist
.
proxy::pr_DB
的文档