r - 计算列表所有数据框之间的豪斯多夫距离
问题描述
我有一个数据框列表,每列有 4 列,行数不同。我想计算列表中所有数据帧的 Hausdorff 距离并填充结果矩阵。
library(pracma)
创建列表
data_frame1<-data.frame("ID"=1:10, "Sum1"= c(4, -2, 16, 20, 13, 4,2,0, 0, -12), "Sum2"=c(-3,-6, 0, 10, 6, 2, 4, -8, 0, 0))
data_frame2<-data.frame("ID"=1:6, "Sum1"= c(13, 4,2,0, 0, -12), "Sum2"=c(10, 6, 2, 4, -8, 0))
data_frame3<-data.frame("ID"=1:5, "Sum1"= c(9,3,5,-6,-1), "Sum2"=c(-2,-4,5, 20,38))
data_frame4<-data.frame("ID"=1:12, "Sum1"= c(3,4, 9,3,5,-5, -6,-1,0,16,11,9), "Sum2"=c(-2,8,8,17, 14,-4,5, 21,30, 10, -15,3))
my_list<- list(data_frame1, data_frame2, data_frame3, data_frame4)
创建 4x4 矩阵以使用距离结果填充它
hausdist<-matrix(, 4,4)
i<-1:4
注意我只想计算第 2 列和第 3 列的距离
P<-as.matrix(my_list[[i]][c(2,3)])
Q<-as.matrix(my_list[[i+1]][c(2,3)])
### Loop for calculation of hausdorff distance.
for (i in (i+1):3) {
hausdist[[i]]<- print(hausdorff_dist(P,Q))
}
print(hausdist)
[,1] [,2] [,3] [,4]
[1,] NA 13.15295 NA NA
[2,] NA NA NA NA
[3,] 13.15295 NA NA NA
[4,] 13.15295 NA NA NA
#### Correct values:
hausdorff_dist(as.matrix(my_list[[3]][c(2,3)]),as.matrix(my_list[[4]][c(2,3)]))
[1] 13.15295
> hausdorff_dist(as.matrix(my_list[[1]][c(2,3)]),as.matrix(my_list[[2]][c(2,3)]))
[1] 10.44031
分别计算距离时,结果是正确的,但是使用循环我对所有数据帧对都有相同的值。
解决方案
尝试双sapply
循环。
hd <- function(X, Y){
P <- as.matrix(X[2:3])
Q <- as.matrix(Y[2:3])
hausdorff_dist(P, Q)
}
sapply(my_list, function(X){
sapply(my_list, function(Y) hd(X, Y))
})
# [,1] [,2] [,3] [,4]
#[1,] 0.00000 10.44031 34.13210 26.07681
#[2,] 10.44031 0.00000 31.30495 23.85372
#[3,] 34.13210 31.30495 0.00000 13.15295
#[4,] 26.07681 23.85372 13.15295 0.00000
outer
虽然我发现以前的解决方案更直观,但这里是使用and的单行代码Map
。
outer(my_list, my_list, FUN = function(x, y) Map(hd, x, y))
# [,1] [,2] [,3] [,4]
#[1,] 0 10.44031 34.1321 26.07681
#[2,] 10.44031 0 31.30495 23.85372
#[3,] 34.1321 31.30495 0 13.15295
#[4,] 26.07681 23.85372 13.15295 0
推荐阅读
- google-cloud-dataflow - 数据流作业 - update_if_exists?
- azure - 警告:ansible 2.10.3 不提供额外的“天蓝色”
- javascript - 通过反应性方式更新组件
- ansible - Ansible - 从动态变量中设置事实
- python - 如何替换文件中的列表?
- java - 重新启动春季批处理作业
- java - 在 Java 中执行 while 循环以捕获异常
- apache-spark - PySpark 从其数组对象值中获取相关记录
- javascript - 为蛇游戏生成一个新的随机画布点
- python - 属性错误:'dict' 对象没有属性 find_all 错误